java - 当我的子类位于不同的包中时,为什么我的子类无法访问其父类(super class)的 protected 变量?

标签 java package access-modifiers protected

我在database.relation包中有一个抽象类relation,在database包中有一个它的子类Join .操作relation 有一个名为 mStructure 的 protected 成员。

加入中:

public Join(final Relation relLeft, final Relation relRight) {
        super();
        mRelLeft = relLeft;
        mRelRight = relRight;
        mStructure = new LinkedList<Header>();
        this.copyStructure(mRelLeft.mStructure);

        for (final Header header :mRelRight.mStructure) {
        if (!mStructure.contains(header)) {
            mStructure.add(header);
        }
    }
}

上线

this.copyStructure(mRelLeft.mStructure);

for (final Header header : mRelRight.mStructure) {

我收到以下错误:

The field Relation.mStructure is not visible

如果我将这两个类放在同一个包中,则效果非常好。谁能解释一下这个问题吗?

最佳答案

它可以工作,但只有您的 child 尝试访问它自己的变量,而不是其他实例的变量(即使它属于同一继承树)。

请参阅此示例代码以更好地理解它:

//in Parent.java
package parentpackage;
public class Parent {
    protected String parentVariable = "whatever";// define protected variable
}

// in Children.java
package childenpackage;
import parentpackage.Parent;

class Children extends Parent {
    Children(Parent withParent ){
        System.out.println( this.parentVariable );// works well.
        //System.out.print(withParent.parentVariable);// doesn't work
    } 
}

如果我们尝试使用 withParent.parentVariable 进行编译,我们会得到:

Children.java:8: parentVariable has protected access in parentpackage.Parent
    System.out.print(withParent.parentVariable);

它是可访问的,但只能访问它自己的变量。

关于java - 当我的子类位于不同的包中时,为什么我的子类无法访问其父类(super class)的 protected 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24626119/

相关文章:

java - JVM 非内联方法优化

linux - 无法找到 RHEL 8 的 libnl RPM 软件包?

swift - Swift 中的好友类(访问内部类的私有(private)成员)

java - 如果可以通过反射绕过访问修饰符,那么访问修饰符的目的是什么?

c# - 为什么我们不能在 C# 中重写方法时更改访问修饰符?

java - web.xml 中的 Servlet url 映射如何使用?

java - 使用 java spring MVC 的 angularjs 登录应用程序

java - 如何将xml文件嵌入到java包中并访问它?

java - Hibernate 1 个模型的多个表名

java - 为什么在 JAVA 中不推荐使用默认包?