2008-12-02 61 views
3

在java中,有三种访问级别:的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); 
    } 
} 
+1

还有包访问。这是没有修饰符的默认值。 – jjnguy 2008-12-02 03:19:33

+0

你确定没错 - a.testing和b.testing没有声明。 你是指a.message和b.message? – 2008-12-02 03:19:49

回答

10

由于保护装置的子类或其他类在同一包。

实际上有第四个“默认”访问级别,当省略修饰符时,可以访问同一包中的其他类。

因此protected是在默认和public之间的访问。

3

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

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

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

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

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

See this similar question了解更多有关遗传标记的信息。我个人几乎从不使用protected。我开发应用程序而不是框架,所以我更可能定义public方法,private数据,并且经常将我的整个班级标记为final

5

实际上有四个访问级别:“public”,“protected”,“private”&默认也被称为包私有或包保护。默认限制包的可访问性。默认是非常有用的,我经常使用它。