在Java中,所有事物都具有某种形式的访问权限控制。
访问权限的控制等级从最大到最小依次为:public,protected,包访问权限(无关键词)和private。
public,protected和private这几个Java访问权限修饰词在使用时,是置于类中每个成员(域或者方法)定义之前的。
一、类成员的访问权限
取得对某成员的访问权的唯一途径是:
1).使该成员成为public。无论谁在哪里,都可以访问该成员;
2).通过不加访问权限的修饰词并将其他类放置于同一包内的方式给成员赋予包访问权限,包内的其他类可以访问该成员;
3).继承而来的类既可以访问public成员也可以访问protected成员。
4).提供访问器和变异器方法,以读取和改变数值。
1.包访问权限
默认访问权限没有任何关键字,但通过是指包访问权限,这表示当前报中的所有其他类都对那个成员有访问权限,但是对于这个包之外的所有类,这个成员确是private。
包访问权限将包内所有相关的类组合起来,以使它们彼此之间可以轻松地相互作用。
注意:如果两个类处于相同的目录下,并且没有给自己设定任何包名称,Java会将这样的文件自动看作是隶属于该目录的默认包之中,于是这些文件互相之间有包访问权限。
下面的例子说明了这个问题:
//类Cake和Pie处于同一目录下,没有明确的显示在任何包中 class Pie{ void f(){ System.out.println("Pie.f()"); } } class Cake{ public static void main(String[] args){ Pie x = new Pie(); x.f(); } } //输出为Pie.f()
2.public:接口访问权限
使用关键字public,就意味着其后的成员声明对所有人可用,特别是使用类库的客户程序员也是如此。
3.private:你无法访问
关键字private表示出了包含该成员的类之外,其他任何类都无法访问这个成员。同一包内的其他类不可以访问这个类的private成员,因此这相当于自己隔离了自己。
private关键字的这种作用有许多用途,比如,控制如何创建对象,阻止别人直接访问某个特定的构造器(或全部构造器)。看
下面的例子:
class Sundae{ private Sundae(){} static Sundae makeASundae(){ return new Sundae(); } } public class IceCream { public static void main(String[] args){ Sundae x = Sundae.makeASundae(); } }
这个例子里,我们可以通过调用makeASundae()方法来创建Sundae对象,但是不能通过构造器来创建。
这对于类中的private域同样适用。
但是要注意一点,不能因为在类中某个对象的引用是private,就认为其他的对象无法拥有该对象的public引用。
4.protected:继承访问权限
如果创建了一个新包,并自另一个包继承类,那么唯一可以访问的成员就是源包的public成员。
有时,基类的创建者希望将某个特定成员的访问权限赋予派生类而非所有类,这就需要使用关键字protected来实现。
注意,protected也提供包访问权限,即相同包内的其他类也可以访问此类的protected元素。
二、接口和实现
访问权限的控制通常被称为具体实现的隐藏。
把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。
出于两个重要的原因,访问权限控制将权限的边界划在了数据类型的内部:
1.要设定客户端程序员可以使用和不可以使用的界限。可以在结构中建立自己的内部机制,儿不必担心客户端程序员会偶然地将内部机制当做是他们使用的接口的一部分。
2.接口和具体实现进行分离。
三、类的访问权限
Java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的。
修饰词必须放在关键字class之前。例如:
public class Widget{......}
或
improt access.Widget;
要知道,类不可以是private的(如果类是private的,那么除了该类之外,其他任何类都不可以访问它),也不可以是protected的(其实一个内部类可以是private或protected的,但这是特例,后续文章中叙述),只可以是包访问权限或public的。
如果不希望其他人访问该类,可以把该类的所有构造器都指定为private,阻止任何人创建该类的对象。但这也有例外,这种做法不能阻止你在该类的static成员内部创建该类。我们来看下边的例子:
class Soup1{ private Soup1(){} public static Soup1 makeSoup(){ //使用静态方法创建对象 return new Soup1(); } } class Soup2{ private Soup2(){} private static Soup2 ps1 = new Soup2(); //使用单例模式创建对象 public static Soup2 access(){ return ps1; } public void f(){} } public class Lunch { void testPrivate(){ //Soup1 soup = new Soup1; 不能执行 } void testSingleton(){ Soup2.access().f(); } }
我们可以看到,Soup1和Soup2类的构造器都是private的,谁也无法直接使用构造器来创建该类的对象了。但是我们也可以使用这两个类:在Soup1中创建一个static方法,在这个方法中使用构造函数创建一个Soup1对象并返回它的引用;Soup2的创建用了设计模式中的单例模式,只能创建它的一个对象。Soup2类的对象是作为Soup2的一个static private成员而创建的,所以有且仅有一个,而且除非是通过public方法access(),否则是无法访问到它的。
此外,一些限制也值得注意:
1.每个编译单元都只能有一个public类。
2.public类的名称必须完全与含有给编译单元的文件名相匹配,包括大小写。
3.如果编译单元内没有带public的类,这时可以对文件随意命名。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍理解Java访问权限控制,包括了理解Java访问权限控制的使用技巧和注意事项,需要的朋友参考一下 今天我们来一起了解一下Java语言中的访问权限控制。在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制。考虑两个场景: 场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理? 场景2:如果工程师A编写了一个
本文向大家介绍Java编程访问权限的控制代码详解,包括了Java编程访问权限的控制代码详解的使用技巧和注意事项,需要的朋友参考一下 本文研究的主要是Java编程访问权限的控制的相关内容,具体介绍如下。 之前没去注意的修饰符,一般变量前面没添加,一个是不知道有什么用,一个是懒,后面遇到项目的时候就会发现私有和公有区别还是很大的。 (1)首先是包名 使用一个类的时候,例如集合类,就需要引入这个包,然后
本文向大家介绍java类访问权限与成员访问权限解析,包括了java类访问权限与成员访问权限解析的使用技巧和注意事项,需要的朋友参考一下 在写代码的时候有个问题:包内定义了一个接口类,另外一个包要实现它,这里采用接口隔离与依赖倒置原则,将两个包的依赖关系倒置过来。但是,这里就遇到了一个问题,实现类采用工厂模式来实例化,所以实现类就不想暴露给包外,但是实现类还要实现public接口。所以这里有产生了一
本文向大家介绍Java访问权限原理与用法详解,包括了Java访问权限原理与用法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java访问权限原理与用法。分享给大家供大家参考,具体如下: 构造者模式思想 进行初始化,解决了多个构造器重载,构造器参数过多记不住的情况。 包 层次结构 package 父包[.子包.······]; 包名:小写字母;通常是域名反转.部门名.项目名 包的好处
主要内容:开启 ACL 权限Linux 系统传统的权限控制方式,无非是利用 3 种身份(文件所有者,所属群组,其他用户),并分别搭配 3 种权限(读 r,写 w,访问 x)。比如,我们可以通过 ls -l 命令查看当前目录中所有文件的详细信息,其中就包含对各文件的权限设置: [root@localhost ~]# ls -l total 36 drwxr-xr-x. 2 root root 4096 Apr 15 16:33
本文向大家介绍Java访问权限控制的重要性深入讲解,包括了Java访问权限控制的重要性深入讲解的使用技巧和注意事项,需要的朋友参考一下 前言 人在什么面前最容易失去抵抗力? 美色,算是一个,比如说西施的贡献薄就是忍辱负重、以身报国、助越灭吴;金钱,算是另外一个,我们古人常说“钱乃身外之物,生不带来死不带去”,但我们又都知道“有钱能使鬼推磨”。 除去美色和金钱,我认为还有一个,就是读者的认可——“二