static修饰符是否会更改java中类成员的访问级别?

Arb*_*xha 6 java access-modifiers ocpjp

我正在阅读OCA和OCP的Java 7认证书,我正在尝试用Java 8进行本书的练习,我发现有些东西是连线的.

我有Class1类如下:

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

importantMethod()方法的修饰符受静态保护,并且正如您所看到的那样,包是cert,并且正如本书中所解释的那样,我希望来自另一个包的另一个类(在我的情况下,如下所示的Class2)可以访问importantMethod()方法只有通过继承,但事实证明,从Class2我也可以通过Class1的实例访问importantMethod()方法.

Class2课程:

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

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

exam\Class2.java:7: error: importantMethod() has protected access in Class1
            c1.importantMethod();
              ^
Run Code Online (Sandbox Code Playgroud)

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

cri*_*007 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();
    }
}
Run Code Online (Sandbox Code Playgroud)