java protected方法可访问性

时间:2010-06-17 04:58:14

标签: java oop

在下面的代码中,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();
    }
}

由于

5 个答案:

答案 0 :(得分:45)

protected表示:相同的包或继承。由于您的课程都在default package(现实生活中不推荐),protected启用了访问权限。顺便说一下:如果您尝试测试java访问控制,则忘记default accessdefault access =无修饰符= package private)。

另一方面,

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

答案 1 :(得分:7)

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

  

JLS 6.6 Access Control

     

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

     

JLS 6.6.1 Determining Accessibility

     
      
  • [...]
  •   
  • 只有在类型可访问且声明成员/构造函数允许访问时,才能访问引用类型的成员/构造函数:      
        
    • class:允许访问。
    •   
    • public:仅当以下其中一项为真时才允许访问:      
          
      • 访问该成员或构造函数的行为来自 protected ,其中包含 package 成员或构造函数所在的类声明。
      •   
      • 访问权限正确,如JLS 6.6.2 Details on protected Access中所述。      
            
        • 对象的protected成员/构造函数可以从protected外部访问,只能通过负责实现该对象的代码来声明它。
        •   
      •   
    •   
    • package:当且仅当它出现在包含成员或构造函数声明的顶级类的主体内时才允许访问。
    •   
    • 否则,我们说有默认访问,只有在声明类型的private内进行访问时才允许访问。
    •   
  •   

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

另见

答案 2 :(得分:3)

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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