Java访问标识符--protected和无访问标识符区别

本文深入探讨Java中protected访问修饰符的使用规则,解析其在包内及子类间的可见性,通过具体代码示例展示如何正确使用protected方法。

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

访问控制符声明为protected的成员可以被同一包或者子类访问, 默认访问控制符的成员可以被同一个包访问.

更详细的说, protected的规则如下:

  • 包内可见,并对子类可见.
  • 若子类和父类不在同一个包, 子类中子类实例可以访问从父类继承来的protected方法, 而不能访问父类实例的protected方法

引申: 若和父类不在同一个包中, 子类不能访问其他子类的父类protected方法. 也就是p227说的, 子类只能调用受保护的clone方法来克隆自己的对象的由来.

举例:

//Duck1.java
package playground;

public class Duck1 {
    public static void main(String[] args) {
        Duck1 d = new Duck1();
        d.testSelfClone();
        d.testOtherSubclassClone();
        d.testOtherSubclassWithPublicClone();
    }
    public void testSelfClone() {
        clone(); // 可以, 从父类继承来的
    }
    public void testOtherSubclassClone() {
        Duck2  d2 = new Duck2();
        d2.clone(); // 是要报错的, 不能在子类中调用其他子类的父类protected方法.
    }
    public void testOtherSubclassWithPublicClone() {
        Duck3 d3 = new Duck3();
        d3.clone(); // 可以, 该类开放了public
    }
}

//Duck2.java
package playground;

public class Duck2 { }

//Duck3.java
package playground;

public class Duck3 {
    public Duck3 clone() throws CloneNotSupportedException {
        return (Duck3) super.clone();
    }
}

但是如果子类和父类在同一个包中, 事情又不一样了. 因为在同一个包中, 父类的protected方法是可见的.因此, 子类可以访问别的子类的父类protected方法.

//Bird.java
package playground;

public class Bird {
    protected void pFunc() {
        System.out.println("IN Bird.pFunc.");
    }
}
//Duck1.java
package playground;

public class Duck1 extends Bird{
    public static void main(String[] args) {
        Duck1 d = new Duck1();
        d.testSelfpFunc();
        d.testOtherSubclasspFunc();
        d.testOtherSubclassWithPublicpFunc();
    }
    public void testSelfpFunc() {
        pFunc(); // 可以, 从父类继承来的
    }
    public void testOtherSubclasspFunc() {
        Duck2  d2 = new Duck2();
        d2.pFunc(); // 可以, 因为在同一个包
    }
    public void testOtherSubclassWithPublicpFunc() {
        Duck3 d3 = new Duck3();
        d3.pFunc();
    }
}
//Duck2.java
package playground;
public class Duck2 extends Bird{ }
//Duck3.java
package playground;
public class Duck3 extends Bird { }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值