java - Java 中 protected 访问修饰符

标签 java protected access-modifiers

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

我写了下面的示例代码。我看到如果未注释,注释掉的行会产生编译错误。为什么我可以通过 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();

    }
}

最佳答案

webpage @MadProgrammer 链接给出了一个体面的解释:

"The protected modifier specifies that the member can only be accessed within its own package (as with package-private) and, in addition, by a subclass of its class in another package."

这意味着必须通过定义它的类或所述类的子类直接访问 protected 成员,同时还要在适当的包中。这并不一定意味着您可以通过在所述类的子类中创建的所述类的实例访问 protected 成员。重点是涉及的包。

以下是您的示例:

package first; // Current package

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

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

包含所述成员的(子)类或其继承该成员的父类是否在同一个包中定义? 是的,First定义在package first中,所以protected成员可以从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; // Current package

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

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

包含所述成员的(子)类或其继承该成员的父类是否在同一个包中定义? 是的,在package second中定义的Second继承了First的成员,所以protected 成员可从 package second 中的 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成员可从 package first 中的 Second 访问。

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 的成员,Second 继承了定义成员的 First (package first),所以 protected 成员可以从 package first 中的 Third 访问。

关于java - Java 中 protected 访问修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15939002/

相关文章:

java - 在 Java 企业应用程序中重新映射 JNDI 资源

java - 嵌套枚举-为什么使用它?

c++ - 如何从派生类通过基类 ptr 访问 protected 基类函数

reactjs - 在 React 中处理服务器端保护路由的正确方法?

在嵌套匿名结构上忽略 C++ 私有(private)修饰符

java - 混淆何时使用私有(private)字段与 protected 字段

java - 将txt文件读入二维数组强制退出

java - 支持数据库连接的系统设计

java - 免费访问 protected 成员(member)

java - 用于多个成员的单个 Java 访问修饰符