博文介绍:
在学习的过程中,发现之前很久都没考虑过的问题。protected 与 default 的区别,和真正的
的使用场景。特此,分享下相关的理解,如有不对的地方请指教,感谢!
作用分析:为了保证系统安全,JDK核心的函数不被其外部调用,防止滥用造成系统安全问题。
场景分析:
什么情况下,使用访问修饰符呢?对于该类重要且核心的函数,不想对外提供入口。
例如:人类的精神网络决策分析函数,只限于人去使用,而不想对外提供开放出去。
权限分析:
Public : 完全放开权限,可以修饰类、变量、和方法;
Protected : 受保护的权限,可以修饰变量和方法在同包或者子类中访问;
Default : 默认的权限,可以修饰类、变量和方法,同包的类可以访问。
Private : 私有的权限,可以修饰变量和方法,只能在本类中访问。
结论推导:
由于 protected 和 default 权限的问题,产生了 "包的可见性" 的概念延伸;
对于 protected 和 default 同包下,所有类都可以访问实例的属性和方法;
对于 protected 和 default 不同包下,所有类都不可以访问实例的属性和方法;
但 protected 除子类外,可以通过继承的方式访问,而不能通过 new 基类的形式调用其方法;
而孙类继承子类后,不同包可以通过 "继承的方式" 访问基类的方法。
总结:受保护的函数,子类可以通过继承的方式访问,但不能实例化基类进行访问。
疑问:通过实例化基类的方式,为什么不能访问呢?因受限于 "包的可见性",遵循定义规范。
代码附录:
基类 :包目录 package com.example.utils.study.C;
package com.example.utils.study.C;
public class Father {
protected int money = 10000;// 1万欧元
}
子类:包目录 package com.example.utils.study.B;
package com.example.utils.study.B;
import com.example.utils.study.C.Father;
public class Son extends Father {
protected int money = 20000; // 2万欧元
public int accessFatherMoney() {
return super.money;
}
public static void main(String[] args) {
System.out.println(new Son().accessFatherMoney());
}
}
孙类:包目录 package com.example.utils.study.A;
package com.example.utils.study.A;
import com.example.utils.study.B.Son;
public class GrandSon extends Son {
public int accessFatherMoney() {
return super.money;
}
public static void main(String[] args) {
System.out.println(new GrandSon().accessFatherMoney());
}
}
希望得到你的参与和支持。 如果内容有描述不恰当的地方,请指出。 谢谢!