您的位置:首页 > 其它

读书笔记之访问权限

2018-02-01 20:57 204 查看
Java中的访问权限关键字有四个等级,即public、default(即没有关键字)、protected、default(即没有关键字)、private,访问权限依次减小。它们的访问权限是如下:

public:权限最大,不会受到类与包的限制,随便访问;

default:必须在同一个包里面才能访问;

protected:对于本包及其子类可见,后面分为子类与父类是否在同一个包中两种情况看待;

private:必须同一个类中才能访问。



需要特别注意的是,Java中的类的修饰只有包访问权限和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(){
System.out.println("f()");
}
}

public class Lunch {
public static void main(String[] args){
Soup1 soup = Soup1.makeSoup();
System.out.println(soup);
Soup2.access().f();
}
}

 关于protected关键字的具体意义,先说结论:其实总结成一句话就是protected方法调用合法性取决于调用者所在的类与方法从根源上看所在的类共包或者是其直接子类。在下面这篇博客中说的很清楚,http://blog.csdn.net/justloveyou_/article/details/61672133;我自己也会做一些实例,方便自己复习。下面讨论子类与父类不在同一个包下面的情况。

//示例一
package p1;
public class Father1 {
protected void f() {} // 父类Father1中的protected方法
}
package p1;
public class Son1 extends Father1 {}

package p11;
public class Son11 extends Father1{}

package p1;
public class Test1 {
public static void main(String[] args) {
Son1 son1 = new Son1();
son1.f(); // Compile OK,protected方法f()来自于Father1类,与 Test1类 在同一包p1中
son1.clone(); // Compile Error,protected方法clone()来自于Object类,与 Test1类不在同一包中
Son11 son = new Son11();
son.f(); // Compile OK,虽然Son11类在包p11中,但protected方法f()来自于Father1类,与 Test1类在同一包p1中
son.clone(); // Compile Error,protected方法clone()来自于Object类,与 Test1类不在同一包中
}
}

 在上面的示例中,类Father1、Son1 和 Test1 在同一个包p1下,类Son11在包p11下。但是我们知道,无论Son1类还是Son11类,它们的protected方法f()在根源上都来自于p1包中的类Father1,而由于Test1也在p1包中,因此f()方法对Test1类可见,编译通过。但由于Son1类和Son11类中的clone()方法在根源上均来自于java.lang包下的类Object,与
Test1类不在同一包中,因此clone()方法对Test1类不可见,编译不通过。

//示例四
package p4;
class MyObject4 extends Test4 {
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

package p44;
public class Test4 {
public static void main(String args[]) {
MyObject4 obj = new MyObject4();
obj.clone(); // Compile Error,protected方法clone()来自于MyObject4类,而Test4类与MyObject4类不在同一个包中
}
}

 该示例与示例三很类似,唯一不同的是 类MyObject4 重写了从 类Test4 中继承过来的protected方法clone()。这样,MyObject4的 protected方法clone()在根源上来自于类本身而非Test4类。而类MyObject4 和类Test4 又不在同一包下,因此编译不通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: