我正在阅读OCA& amp; OCP for java 7认证,我正在尝试使用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()方法。
Class2课程:
package exam;
import cert.Class1;
class Class2 extends Class1 {
public static void main(String[] args) {
Class1 c1 = new Class1();
c1.importantMethod();
}
}
如果我从 Class1 中删除静态修饰符,则在尝试从访问 importantMethod()方法时会出现预期错误>的Class2 :
exam\Class2.java:7: error: importantMethod() has protected access in Class1
c1.importantMethod();
^
我的问题是,非访问修饰符是否会更改类成员的访问级别?
答案 0 :(得分:3)
一切都很好 - protected
访问是如何工作的。它在JLS 6.6.2.1中指定:
让
C
成为声明受保护成员的类。只允许在S
的子类C
的正文中访问。此外,如果
Id
表示实例字段或实例方法,则:
- [
Id
不相关的内容不表示实例字段或实例方法]
您的代码 位于S
的子类C
的正文中(其中S
为Class2
且C
为Class1
)所以没关系。
答案 1 :(得分:2)
事实证明,从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();
}
}