读书笔记之访问权限
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 又不在同一包下,因此编译不通过。
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 又不在同一包下,因此编译不通过。
相关文章推荐
- Thinking-in-Java 读书笔记-6-访问权限控制
- 《JAVA编程思想》读书笔记6——访问权限控制
- 《THING IN JAVA》 6章访问权限控制-读书笔记
- Java编程思想,读书笔记四(第6章 访问权限控制)
- WORKGROUP无法访问。您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限。找不到网络路径。”
- Java学习笔记--不同包的访问权限
- 笔记本电脑无法连接网络并在网络状态中显示ipv4和ipv6无网络访问权限
- SAMBA配置 “你可能没有权限访问网络资源”的问题解决方法
- 包及访问控制权限
- iOS相册访问权限
- 跨进程访问共享内存的权限问题
- 安全空间-程序访问权限攻略
- MySQL数据库远程访问权限如何打开(两种方法)
- APUE 笔记 文件访问权限
- 转的。一个C#的问卷!private、 protected、 public、 internal 修饰符的访问权限
- Java访问权限作用域介绍
- C++中protected的访问权限
- 局域网内共享文件 提示没有访问权限的问题-转载于http://www.pcdog.com/a/29/10/i232880.html
- 基于访问控制列表限制网管SNMP访问权限
- 如何设置windows服务以及web Service服务的访问权限