Java-Protected访问权限问题

本文探讨了Java中的Protected访问权限。当基类和子类在同一包内时,protected成员对两者都可访问;而在不同包时,子类只能访问继承自基类的protected成员,无法访问基类实例的protected成员。总结,同一包内protected与public权限相同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考这篇文章

基类和子类在同一个包中

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一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值