在爪哇,有三个级别的访问:

  • 公众开放的世界
  • 私人只开放给类
  • 保护只开放给类及其子类(遗产继承).

那么,为什么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);
    }
}
有帮助吗?

解决方案

其实它应该是:

只打开的 课程相同的包 类和子类(遗产继承)

这就是为什么

其他提示

因为保护装置的子类 其他的类别,在相同的封装。

并没有实际上的第四个"默认"的级别访问、当修改略,其中提供了访问的其他类在同一软件包。

所以 protected 是之间的默认和 public 访问。

更具体来说,你期待的 protected 到工作,因为它在C++。

然而,在爪哇,它有一个不同的含义。在爪哇,受保护的方法是提供给类(显然),所有其他类别相同的包装和任何子类的这一类。类其他的软件包不会有的访问,除非他们的子类这一原类。

看到这个类似的问题 更具体的信息的有关继承的标记。

就个人而言,我几乎从来没有使用 protected.我应用程序的开发,而不是框架,所以我更有可能定义 public 方法, private 数据,很多时候,记住我的整个类 final.

实际上有四个级别的访问:"公众"、"受保护","私人"和默认也称为软件包的私人或包裹的保护。默认的限制性的软件包。默认是很有用的,我经常使用它。

你能呼叫 b.getMessage()b 的类型 Bloo, ,其延伸 Blah, , getMessage() 受到保护。受保护的,正如你所提到的,允许子类访问的方法。

你已经得到了以下的错误,但:

  • super() 没有争论的 Bloo 构造是一个错误。编译器找不到没有参数 Blah 构造是因为你定义的一串的参数。
  • new Blah()TestBlah main 方法是错误的同样的原因,如上。
  • 参看 a.testingb.testing 是一个错误,因为你没有界定的变量 testing 对于任何类。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top