静态修饰符是否会更改 Java 中类成员的访问级别?



我正在阅读OCA和OCP的java 7认证书,我正在尝试用java 8练习这本书,我注意到有些连线。

我有1类课程如下:

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

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

2类:

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

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

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

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

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

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

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

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

您的代码位于C的子类S的主体中(其中SClass2CClass1),所以没问题。

事实证明

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

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

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

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

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

最新更新