Java受保护的访问不起作用

时间:2008-12-02 03:08:06

标签: 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
    }
}

Blah.java:

public class Blah {
    protected String message;

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

    protected String getMessage(){
        return(this.message);
    }   
}

Bloo.java:

public class Bloo extends Blah {
    public Bloo(String testing) {
        super(testing);
    }
}

5 个答案:

答案 0 :(得分:13)

实际上它应该是:

  

仅打开classes on the same package类及其子类(继承)

这就是为什么

答案 1 :(得分:10)

因为protected意味着在同一个包中继承其他类。

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

因此protected介于默认和public访问之间。

答案 2 :(得分:5)

更具体地说,您希望protected能像在C ++中一样工作。

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

See this similar question了解有关继承标记的更多具体信息。

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

答案 3 :(得分:5)

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

答案 4 :(得分:3)

您可以致电b.getMessage(),因为b类型为Bloo,其范围为BlahgetMessage()受到保护。正如您所提到的,受保护的子类允许子类访问该方法。

但是你有以下错误:

  • super()构造函数中调用没有参数的Bloo是一个错误。编译器找不到无参数Blah构造函数,因为您使用String参数定义了一个。
  • new Blah() TestBlah方法中调用main是错误的原因与上述相同。
  • 引用a.testingb.testing是一个错误,因为您没有为任何类定义变量testing