Java保护的访问没有工作
-
22-07-2019 - |
题
在爪哇,有三个级别的访问:
- 公众开放的世界
- 私人只开放给类
- 保护只开放给类及其子类(遗产继承).
那么,为什么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.testing
和b.testing
是一个错误,因为你没有界定的变量testing
对于任何类。
不隶属于 StackOverflow