我正在阅读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
的主体中(其中S
Class2
,C
Class1
),所以没问题。
,从 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();
}
}