Java中基类的超类的受保护方法会发生什么?

时间:2015-05-13 07:07:53

标签: java inheritance protected

我在A中有一个package1课程,而B中的package2继承了AA包含m1方法protected。现在我的疑问是,当我在B的另一个班级C中创建package2的对象时,B的对象无法访问方法m1为什么?以下是我的代码

package com.package1;

public class A {

    protected void m1(){
        System.out.println("I'm protectd method of A");
    }
}


package com.package2;

import com.package1.A;

public class B extends A {


    public static void main(String[] args) {

        B b = new B();
        b.m1();          // b object able to access m1

    }

}


package com.package2;

public class C {

    public static void main(String[] args) {

        System.out.println("Hi hello");
        B b = new B();
        b.m1(); //The method m1() from the type A is not visible

    }

}

超类的受保护方法在子类中变为私有吗?

1 个答案:

答案 0 :(得分:5)

来自JLS 6.6.2. Details on protected Access

  

对象的受保护成员或构造函数可以从包外部访问,只能通过负责实现该对象的代码来声明它。

     

设C是声明受保护成员的类。只允许在C的子类S的主体内访问。

意味着 protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中使用其类的子类封装

来自Java Doc Controlling Access to Members of a Class
enter image description here

因此,您可以访问类m1中的方法B,即使它不在同一个包中,因为它是A的子类。 但是,您无法从类m1访问方法C,因为它既不在A的同一个包中,也不在A的子类中。

因此,要访问此方法,您可以将方法m1公开,或将您的班级C移至与班级A相同的包中