Java受保护的访问不起作用

Ant*_*ton 3 java inheritance visibility protected access-levels

在java中,有三种访问级别:

  • 公众 - 对世界开放
  • 私人 - 仅向全班开放
  • 受保护 - 仅对类及其子类(继承)打开.

那么为什么java编译器允许这种情况发生呢?

TestBlah.java:

public class TestBlah {

    public static void main(String[] args) {
        Blah a = new Blah("Blah");
        Bloo b = new Bloo("Bloo");
        System.out.println(a.getMessage());
        System.out.println(b.getMessage()); //Works
        System.out.println(a.testing);
        System.out.println(b.testing); //Works
    }
}
Run Code Online (Sandbox Code Playgroud)

Blah.java:

public class Blah {
    protected String message;

    public Blah(String msg) {
        this.message = msg;
    }

    protected String getMessage(){
        return(this.message);
    }   
}
Run Code Online (Sandbox Code Playgroud)

Bloo.java:

public class Bloo extends Blah {
    public Bloo(String testing) {
        super(testing);
    }
}
Run Code Online (Sandbox Code Playgroud)

Osc*_*Ryz 13

实际上它应该是:

仅打开同一个包上的类及其子类(继承)

这就是为什么


Law*_*Dol 10

因为protected表示同一个包中的子类其他类.

当省略修饰符时,实际上存在第四个"默认"访问级别,它提供对同一包中其他类的访问.

protected默认和public访问之间也是如此.


Bob*_*oss 5

更具体地说,你期望protected像C++一样工作.

但是,在Java中,它具有不同的含义.在Java中,类(显然)可以使用受保护的方法,同一个包中的所有其他类以及此类的任何子类.除非他们将这个原始类子类化,否则其他包中的类将无法访问.

有关继承标记的更多具体信息,请参阅此类似问题.

就个人而言,我几乎从未使用过protected.我开发应用程序而不是框架,所以我更有可能定义public方法,private数据,并且经常将我的整个类标记为final.


Jul*_*ang 5

实际上有四种访问级别:"公共","受保护","私有"和默认也称为包私有或包受保护.默认值限制包的可访问性.默认是非常有用的,我经常使用它.