Java-Protected访问权限问题

  • Post author:
  • Post category:java




基类和子类在同一个包中

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
    }
}
  1. 如代码所示,基类T1和子类T2,以及TestProtected类位于同一个包中,在TestProtected类中,可以实例化T2,并访问T1中的protected方法。

  2. T1和T2位于同一包中,可以在继承类T2中创建T1的对象,并通过该对象访问T1中的protected方法。

  3. 总结,对于同一包中,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{

}
  1. 如上代码所示,基类Object和子类T1不在一个包中,在子类中创建Object对象,利用该对象也无法访问clone()方法,更不用说在TestProtected中(与Object不同包,且没有继承关系)。
  2. 但是,依然可以在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{

}


总结

  1. 与基类不在同一个包中的子类,只能访问自身从基类继承而来的受保护成员,而不能访问基类实例本身的受保护成员!
  2. 对于同一包中的访问,不管是继承类和别的非继承类,protected修饰符的访问权限与public一致。