在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); } }
OscarRyz.. 13
实际上它应该是:
仅打开同一个包上的类及其子类(继承)
这就是为什么
实际上它应该是:
仅打开同一个包上的类及其子类(继承)
这就是为什么
因为protected表示同一个包中的子类或其他类.
当省略修饰符时,实际上存在第四个"默认"访问级别,它提供对同一包中其他类的访问.
protected
默认和public
访问之间也是如此.
更具体地说,你期望protected
像C++一样工作.
但是,在Java中,它具有不同的含义.在Java中,类(显然)可以使用受保护的方法,同一个包中的所有其他类以及此类的任何子类.除非他们将这个原始类子类化,否则其他包中的类将无法访问.
有关继承标记的更多具体信息,请参阅此类似问题.
就个人而言,我几乎从未使用过protected
.我开发应用程序而不是框架,所以我更有可能定义public
方法,private
数据,并且经常将我的整个类标记为final
.
实际上有四种访问级别:"公共","受保护","私有"和默认也称为包私有或包受保护.默认值限制包的可访问性.默认是非常有用的,我经常使用它.