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

roc*_*ock 2 java inheritance protected

我有一个A班级,package1Bpackage2其中继承A.A包含方法m1protected.现在我的疑问是,当我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

    }

}
Run Code Online (Sandbox Code Playgroud)

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

Sum*_*ngh 5

来自JLS 6.6.2.受保护访问的详细信息

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

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

装置protected修饰符指定了构件只能在其自己的封装件内被访问的(与包专用),此外,通过它的类的另一个包的子类.

Java Doc控制对类成员的访问
在此输入图像描述


所以你可以m1从类访问方法,B即使它不在同一个包上,因为它是它的子类A.
但是你不能m1从类访问方法,C因为它既不在同一个包中,A也不在它的子类中A.

因此,要访问此方法,您可以将方法设为m1public,或将您的类移动C到与类相同的包中A