对于protected的解释,在很多java书上是这样解释:
被 protected 修饰的成员对于本包和其子类可见。
在菜鸟教程上的解释:
- 基类的 protected 成员是包内可见的,并且对子类可见;
- 若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。
然而都看起来比较难懂,所以我这里说一下我对protected的看法:
1.子类和基类在同一个包中,那么该包的所有类都能访问protected方法。
2.子类和基类不在同一个包中,那么在另一个包中的子类以及子类的派生类中可以用本类的实例访问protected方法,并且在另一个包中的子类中还可以用派生类实例访问它派生类的protected,但反过来不成立。
这里看个栗子:
在包b中,有个B类。
1 package b; 2 3 public class B implements Cloneable{ 4 protected Object clone() throws CloneNotSupportedException{ 5 return super.clone(); 6 } 7 protected void fun() { 8 System.out.println("B"); 9 } 10 11 }
在包a中有A,C,D三个类,其中C继承了b包中的B类
package a; import b.*; class D { protected void function() { A a = new A(); //a.fun(); // 错误,在普通类中不能调用protected System.out.println("D"); } } class C extends B { protected void fun1() { fun(); A a = new A(); a.fun(); //派生类实例调用protected System.out.println("C"); } } public class A extends C { protected int a1 = 1; public static void main(String[] args) throws CloneNotSupportedException { A a = new A(); a.fun(); //本类实例调用protected a.clone(); C c = new C(); //c.fun(); // 错误,在派生类中不能用基类实例调用protected //c.clone(); // 错误,在派生类中不能用基类实例调用protected } }
protected 是最难理解的一种 Java 类成员访问权限修饰词,更多详细内容请查看 Java protected 关键字详解。