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

时间:2017-04-11 13:03:19

标签: java access-modifiers ocpjp

我正在阅读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();
              ^

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

2 个答案:

答案 0 :(得分:3)

一切都很好 - protected访问是如何工作的。它在JLS 6.6.2.1中指定:

  

C成为声明受保护成员的类。只允许在S的子类C的正文中访问。

     

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

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

您的代码 位于S的子类C的正文中(其中SClass2CClass1)所以没关系。

答案 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();
    }
}