在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);
}
}
答案 0 :(得分:13)
答案 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
,其范围为Blah
,getMessage()
受到保护。正如您所提到的,受保护的子类允许子类访问该方法。
但是你有以下错误:
super()
构造函数中调用没有参数的Bloo
是一个错误。编译器找不到无参数Blah
构造函数,因为您使用String参数定义了一个。new Blah()
TestBlah
方法中调用main
是错误的原因与上述相同。a.testing
和b.testing
是一个错误,因为您没有为任何类定义变量testing
。