为什么我的子类无法访问其超类的受保护变量,当它位于不同的包中时?

2022-09-01 09:52:51

我有一个抽象类,在包中和它的子类中,在包中。 具有名为 的受保护成员。relationdatabase.relationJoindatabase.operationsrelationmStructure

在:Join

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) {

我收到以下错误:

“关系.m结构”字段不可见

如果我把两个类放在同一个包中,这很完美。任何人都可以解释这个问题吗?


答案 1

它有效,但只有你,子级尝试访问它自己的变量,而不是其他实例的变量(即使它属于同一继承树)。

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

//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);

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


答案 2

关于受保护的一个鲜为人知的警告:

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

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