JAVA从入门到放弃(4)访问控制权限

J

所谓的访问权限控制说的简单一些就是那些可以访问那些不可以被访问,我们可以通过权限控制的修饰词来标明权限

从小到大一次是:private -> protected  -> public。不过仅有上面的一些关键字还不足以解决一个问题,就是如何将构件捆绑到一个内聚的类库单元,这个时候我们就需要引入package(包访问权限)加以控制

前面给出的示例中存在import语句,这里的improt引入的就是package,当我们组织代码的时候就要创建自己的package,使用方法如下

不过package这个语句需要在整个java文件的最开头,也就是第一句非注释性代码。你可能会问前面是用的import和package到底有什么作用,这里使用这两个关键字所允许的就是将单一的命名空间分隔开。

前面已经说了如何声明包以及如何引入包,如果我们有多个.java文件,我们需要挨个复制,并且保证结构,这种情况下就很适合我们创建一个包来管理众多的.java文件(自然了我们需要在所有的.java文件中写上所属的包)。现在需要关注的就是如何创建一个独一无二的包。比方说我们现在有一个cn.accut.*的包,那么为了保证结构的严谨,我们的文件夹结构中需要有…/cn/accut

假设我们在自己的package中定义了一个Vector类,而Java标准类库中也存在Vector类,这个时候Java对于你希望使用那个Vector类会感到模糊,因此我们就应该在容易模糊的地方写上所属的包名,例如

这样我们就可以明确声明这个Vector类是java.util包中的,而不是你自己自定义的Vector。自然我们还可以用import来改变运行的情况,所谓的改变运行的情况就是类似于C语言的预编译条件,而Java原生并不支持这种预编译条件,但是我们可以通过import来实现类似的功能。例如-我们可以定义一个名为debug的package,我们在试用结束后可以改引用名为release的包。这里只是方便调试了

下面我们说一下Java中的包内访问权限,简称包访问权限,也就是不加任何修饰词的权限就是默认的包访问权限,拥有包访问权限的类可以被同一个包内的所有成员访问,再强调一次这是默认访问权限,也就是不加任何修饰词的权限

上面的代码没有使用package,但是却能正常运行,是因为如果没有声明package则默认在一个文件夹下的java文件属于同一个包,这时就处在一个包里了,所以包访问权限就可以发挥作用

比默认包访问权限还要大的是public权限,所谓public权限就是声明自身对所有成员都可用,也就是对大众公开,前面的.java文件中只允许有一个类就是public类,在一个java文件中public类只能有一个,也就是说剩下的类最高权限只能是包访问权限。

这里的代码和上面的的稍微有些区别,因为我们在这里引入了package,在我们引入package的时,就将两个java文件放入了同一个命名空间,也就是说Cookie类在Dinner类中也可以访问,但是bite函数只拥有包访问权限,在包外是不可见的,但是因为引入了包,而且包中的Cookie是public,public对所有成员都可以访问,因此可以调用

下面来写一下private,个人认为这是一个保护欲极强的权限,他不允许任何外部的访问,也就是说private对包外完全是不可兼得,因此这就有一个很好的方法让你将你的具体实现方法保护起来,保护他不受外界干扰。同时当忘记为你得方法设置关键字时,private也是一个默认关键字,其实他的权限和上面的包访问权限相比,private更狭窄,private在类外就禁止访问更别提是包外了,我们可以使用private来限制一个类的初始化

我们将一个类的构造器设置为private这样这个类就不能使用new被创建了,因为new是需要调用构造器来生成一个新类的,但是在这里构造器是不可以访问的,所以就限制了类的new,但是可以通过static方法来返回一个指向这个类的引用,我们姑且称这个函数是类创建函数,前面我们提到了static的一些特性,我们也知道static并不需要初始化就可以直接调用,所以这里我们使用static函数作为类创建函数。就像前面写的那样我们可以把一些不像其他人改动的地方设置为private

但是private会导致一个很致命的问题private声明的成员并不会被继承,如果希望这个成员不被外部访问但是可以被继承,我们或许就应该使用protected。protected处理的就是针对于继承问题中成员的延续(延续好像不太恰当)protected将他的访问权限授权给他的派生类而不是所有类。

这一段代码就显示出了protected在集成中的作用,如果bite()没有使用protected修饰符,默认就是private,那就不能对外部访问。但是需要注意的是,这里的bite()虽然可以访问但不是public

前面我们说的权限基本都是对于类内成员和方法来说的,那么对于类应该也有访问权限,之前说过了,一个.java文件中只能有一个public class。那么是不是就意味这其他类可以是private或者protected,并不是。常规类只能有两个权限,一个是friendly(或者叫默认权限)就是没有修饰词,一个是public。一些内部类可以是private或者是protected

在这一篇的最后介绍一个设计模式:单例模式

这就是一个单例模式的典型模式,首先我们通过private构造器使之无法从外部调用new,然后我们初始化了一个static变量,在变量中使用new初始化,最后使用一个access函数来返回引用。因为static的存在所以这个变量在内存中只有一份,因此不论怎么操作,SingleTon类始终只有一个实例化,因此被称为单例模式

About the author

NOBUG.IN

Add comment

By NOBUG.IN

Your sidebar area is currently empty. Hurry up and add some widgets.