6

我正在阅读有关 Java 7 认证的 OCA 和 OCP 的书,我正在尝试使用 Java 8 进行本书的练习,我注意到一些连线的东西。

我有 Class1 类如下:

package cert;
public class Class1{
    protected static void importantMethod(){
    System.out.println("importantMethod() method of Class1 class TEST \n");
}

如您所见, importantMethod()方法的修饰符是受保护的静态的,并且包是cert,正如书中所解释的,我希望另一个包中的另一个类,在我的例子中为Class2,如下所示,可以访问importantMethod()方法只能通过继承,但事实证明,从Class2我也可以通过Class1的实例访问importantMethod()方法。

2 类:

package exam;
import cert.Class1;
class Class2 extends Class1 {
    public static void main(String[] args) {
        Class1 c1 = new Class1();
        c1.importantMethod();
    }
}

如果我从Class1中删除static修饰符,它会在尝试从Class2访问importantMethod()方法时给出预期的错误:

exam\Class2.java:7: error: importantMethod() has protected access in Class1
            c1.importantMethod();
              ^

我的问题是,非访问修饰符会改变类成员的访问级别吗?

4

2 回答 2

3

一切都很好 - 这就是protected访问的工作方式。它在JLS 6.6.2.1中指定:

C是声明受保护成员的类。仅允许在 的子类的主体内S访问C

此外,如果Id表示实例字段或实例方法,则:

  • [不相关的东西Id不表示实例字段或实例方法]

您的代码在(where is和is ) 的子类S的主体内,所以没关系。CSClass2CClass1

于 2017-04-11T14:05:24.567 回答
2

原来,从 Class2 我可以通过 Class1 的实例访问 importantMethod() 方法

您不需要实例来调用静态方法。Class1.importantMethod()工作正常。如果您删除static,则不会,这就是您所看到的。

如果我从 Class1 中删除 static 修饰符,它会给出预期的错误

因为您在不同的包中,而不是像这样通过继承调用该方法

package exam;
import cert.Class1;
public class Class2 extends Class1 {

    public static void main(String[] args) {
        new Class2().importantMethod();
    }
}
于 2017-04-11T13:17:36.763 回答