java protected方法可访问性

在下面的代码中,Consumer类可以访问Parent类的受保护方法。如何实现,因为Parent和Consumer类之间没有关系。请解释

class Parent { public void method1(){ System.out.println("PUBLIC METHOD"); } private void method2(){ System.out.println("PRIVATE METHOD"); } protected void method3(){ System.out.println("PROTECTED METHOD"); } } public class Consumer { public static void main(String[] args){ Parent parentObj = new Parent(); parentObj.method1(); //parentObj.method2(); parentObj.method3(); } } 

谢谢

protected意思是:相同的包或通过inheritance。 由于您的类都在default package (在现实生活中不推荐),因此protected启用访问。 顺便说一句:如果你试图测试java访问控制,你就忘记了default accessdefault access =没有修饰符= package private )。

另一方面, private访问意味着:除了这个特定的类(以及仍然是宿主类成员的非静态内部类)之外,从无处访问。

以下是Java语言规范的相关摘录:

JLS 6.6访问控制

Java编程语言提供访问控制机制,以防止packageclass的用户依赖于该packageclass的实现的不必要细节。 如果允许访问,则称所访问的实体是可访问的

JLS 6.6.1确定可访问性

  • […]
  • 只有在类型可访问且声明成员/构造函数允许访问时,才能访问引用类型的成员/构造函数:
    • public :允许访问。
    • protected仅当满足以下条件之一时才允许访问
      • 包含 声明 protected 成员或构造函数 的类 package 发生对成员或构造函数的访问
      • 访问是正确的,如JLS 6.6.2中有关protected访问的详细信息中所述。
        • 可以从package外部访问对象的protected成员/构造函数,只能通过负责实现该对象的代码来声明它。
    • private :当且仅当它发生在包含成员或构造函数声明的顶级类的主体内时才允许访问。
    • 否则,我们说存在默认访问权限 ,只有在声明类型的package中发生访问时才允许访问。

粗体部分是本场景中问题的答案: ParentConsumer属于同一个package ,因此,至少可以从Consumer访问Parent protected成员。

也可以看看

  • Java教程/控制对类成员的访问

首先,它们属于同一个包装。 其次,消费者是父母的内在阶级。

亚当你是对的! 它们位于同一个包中,这就是为什么消费者类能够访问父类的受保护方法。 消费者不是父母的内在阶级。