Java protected 权限问题
基类和子类在同一个包中
package com.lemon.JavaSe;
public class TestProtected{
public static void main(String[] args) throws NoSuchMethodException, SecurityException, CloneNotSupportedException{
T2 t2=new T2();
t2.f();// compile ok
}
}
class T1{
protected void f(){
System.out.println("T1:f()");
}
}
class T2 extends T1{
T1 t1=new T1();
public void g(){
t1.f();//compile ok
}
}
-
如代码所示,基类T1和子类T2,以及TestProtected类位于同一个包中,在TestProtected类中,可以实例化T2,并访问T1中的protected方法。
-
T1和T2位于同一包中,可以在继承类T2中创建T1的对象,并通过该对象访问T1中的protected方法。
-
总结,对于同一包中,protected和public是一致的。
基类和子类不在同一包中
package com.lemon.JavaSe;
public class TestProtected{
public static void main(String[] args) throws NoSuchMethodException, SecurityException, CloneNotSupportedException{
T2 t2=new T2();
t2.f();
T1 t1=new T1();
t1.clone();//compile error
//System.out.println(T1.class.getMethod("clone", T1.class));
}
}
class T1{
protected void f(){
System.out.println("T1:f()");
Object object=new Object();
object.clone();//compile error
}
}
class T2 extends T1{
}
- 如上代码所示,基类Object和子类T1不在一个包中,在子类中创建Object对象,利用该对象也无法访问clone()方法,更不用说在TestProtected中(与Object不同包,且没有继承关系)。
- 但是,依然可以在T1中重写Object类中的clone()方法。
package com.lemon.JavaSe;
public class TestProtected{
public static void main(String[] args) throws NoSuchMethodException, SecurityException, CloneNotSupportedException{
T2 t2=new T2();
t2.f();
T1 t1=new T1();
t1.clone();//compile ok
//System.out.println(T1.class.getMethod("clone", T1.class));
}
}
class T1{
protected void f(){
System.out.println("T1:f()");
}
protected Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
class T2 extends T1{
}
总结
- 与基类不在同一个包中的子类,只能访问自身从基类继承而来的受保护成员,而不能访问基类实例本身的受保护成员!
- 对于同一包中的访问,不管是继承类和别的非继承类,protected修饰符的访问权限与public一致。