10

我在理解 java 中受保护的访问修饰符(或其背后的设计)时遇到了一些麻烦。我认为这意味着包访问和通过继承包含抽象成员的类的对象进行访问。

我编写了以下示例代码。我看到如果未注释,注释掉的行会产生编译错误。为什么我可以通过 Second 中的 Second 对象访问 pro 而不能通过 Second 中的 First 对象?

package first;

public class First {

    protected void pro(){
        System.out.println("Can see protected method");
    }

}

package first;

public class InFirst {


    public static void main(String[] args){
        First fst = new First();
        fst.pro();
    }

}

package second;

import first.First;

public class Second extends First {

    public static void main(String[] args){

        First fst = new First();

//      fst.pro();

        Second sec = new Second();
        sec.pro();

    }
}
4

4 回答 4

17

链接的网页@MadProgrammer 给出了一个不错的解释:

“受保护的修饰符指定该成员只能在其自己的包中访问(与包私有一样),此外,它的类在另一个包中的子类也可以访问。”

这意味着必须通过定义它的类或该类的子类直接访问受保护的成员,同时也必须位于适当的包中。这并不一定意味着您可以通过在所述类的子类中创建的所述类的实例来访问受保护的成员。重点是所涉及的软件包。

以下是您的示例:

package first; // Current package

First fst = new First(); // from package first and does not extend anything
fst.pro();

试图从哪个包访问有问题的成员?第一的

包含所述成员的(子)类或其继承成员的父类是否在同一个包中定义?是的,First在 中定义package first,因此可以从中protected访问该成员。Firstpackage first

package second; // Current package

First fst = new First(); // from package first and does not extend anything
fst.pro();

试图从哪个包访问有问题的成员?第二

包含所述成员的(子)类或其继承成员的父类是否在同一个包中定义?不,First在 中定义package first,因此protected使成员无法从First中访问package second

package second; // Current package

Second sec = new Second(); // from package second and extends First from package first
sec.pro();

试图从哪个包访问有问题的成员?第二

包含所述成员的(子)类或其继承成员的父类是否在同一个包中定义?是的,Second在 中定义的package second,从 中继承成员First,因此protected可以从Second中访问该成员package second

为了清楚起见,更多示例:

package first; // Current package

Second sec = new Second(); // from package second and extends First from package first
sec.pro();

试图从哪个包访问有问题的成员?第一的

包含所述成员的(子)类或其继承成员的父类是否在同一个包中定义?是的,Second继承了在First中定义package first的成员,因此protected可以从Second中访问该成员package first

package first; // Current package

Third third = new Third(); // from package third and extends Second from package second,
                           // which extends First from package first
third.pro();

试图从哪个包访问有问题的成员?第一的

包含所述成员的(子)类或其继承成员的父类是否在同一个包中定义?是的,Third从 继承成员Second,它从First定义成员的位置(package first)继承它,因此protected可以从Thirdin访问该成员package first

于 2013-04-11T08:57:24.640 回答
2

受保护与默认这是显示访问级别的图表。您的代码属于图中 Convertible 中的 R(Reference) 案例。即不允许访问另一个包中的子类中的引用。

于 2013-04-11T00:51:41.123 回答
1

java中受保护的成员

相同的包-(它的行为类似于默认)

它可以在同一个类、它的子类和非子类中访问。(它的行为类似于默认值)您甚至可以使用父或子引用访问受保护的成员。

外包装——

它只能由 itz 子类访问,这里最重要的一点是使用的引用必须仅属于同一个子类

于 2017-09-06T15:30:22.707 回答
0

protected 表示对同一包中的其他类可见。由于 Second 位于不同的包“second.Second”中,因此它无法首先访问 .pro()。

如果您在“first”的包名称下创建了 Second - 它就会起作用。

于 2013-04-11T00:52:08.390 回答