3

在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
    }
}

废话.java:

public class Blah {
    protected String message;

    public Blah(String msg) {
        this.message = msg;
    }

    protected String getMessage(){
        return(this.message);
    }   
}

布卢.java:

public class Bloo extends Blah {
    public Bloo(String testing) {
        super(testing);
    }
}
4

5 回答 5

14

其实应该是:

仅对类及其子类(继承)同一个包上的类开放

这就是为什么

于 2008-12-02T03:20:08.200 回答
11

因为受保护的意思是同一个包中的子类其他类。

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

protected在默认和public访问之间也是如此。

于 2008-12-02T03:18:18.467 回答
5

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

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

有关继承标记的更多具体信息,请参阅此类似问题

就个人而言,我几乎从不使用protected. 我开发应用程序而不是框架,因此我更有可能定义public方法、private数据,并且经常将我的整个类标记为final.

于 2008-12-02T03:44:13.267 回答
5

实际上有四个访问级别:“公共”、“受保护”、“私有”和默认也称为包私有或包保护。默认限制对包的可访问性。默认非常有用,我经常使用它。

于 2008-12-02T04:15:21.923 回答
3

您可以调用b.getMessage(),因为b它的类型Bloo是扩展Blah,并且getMessage()受到保护。正如您所提到的,受保护的允许子类访问该方法。

但是,您有以下错误:

  • super()在构造函数中不带参数调用Bloo是错误的。编译器找不到无参数Blah构造函数,因为您定义了一个带有字符串参数的构造函数。
  • new Blah()由于与上述相同的原因,调用TestBlah main方法是错误的。
  • 引用a.testingandb.testing是一个错误,因为您没有testing为任何类定义变量。
于 2008-12-02T03:23:24.150 回答