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

问题描述 投票:0回答:2

我在

A
中有一个
package1
类,而
B
位于
package2
中,它继承了
A
A
包含方法
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

    }

}

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

java inheritance protected
2个回答
8
投票

JLS 6.6.2。有关受保护访问的详细信息

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

设 C 为声明受保护成员的类。仅允许在 C 的子类 S 的体内进行访问。

Means

protected
修饰符指定该成员只能在其自己的包内访问(与 package-private 一样),此外,还可以由另一个包中的该类的子类访问。

来自 Java 文档控制对类成员的访问
enter image description here


因此,您可以从类

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

因此,要访问此方法,您可以将方法

m1
公开或将您的类
C
移动到与类
A

相同的包中

0
投票

文档告诉我们的主要内容是受保护的字段只能从包内的包或另一个包中的子类访问。但它不会通过其他任何地方的对象来说明任何信息。任何对象都应该从包内的包或另一个包中的子类调用它。

© www.soinside.com 2019 - 2024. All rights reserved.