Java中,超类中的受保护成员对间接子类不可访问。

3
为什么在Java中,一个超类的受保护成员在不同包中的间接子类中是不可访问的?我知道不同包中的直接子类可以访问超类的受保护成员。我认为任何子类都可以访问其继承的受保护成员。
编辑:对不起,这是初学者的错误,子类可以访问间接超类的受保护成员。

1
如果您能提供一个具体的例子,那么理解您的意思会更容易。 - Jon Skeet
他的意思是在汇编a1中有一个类a。这个类有一个受保护的成员。然而,他无法从扩展a的类b中的汇编a2访问受保护的成员,我想。 - Oskar Kjellin
不,他的意思是他不能从类别a2中继承自类别b和类别a的受保护成员并访问类别c中的受保护成员。 - danben
“间接子类”是什么意思?您是指子类的子类吗?还是什么? - Jay
@MSumlong:我猜对了!!! :) 我在创建答案中的示例代码时也遇到了同样的错误,但由于它很小,所以我立即找出了解决方法。 :) - OscarRyz
显示剩余2条评论
2个回答

12

也许你有点困惑。

这是我的快速演示,展示了一个间接子类访问受保护属性的方法:

// A.java
package a;
public class A {
    protected int a;
}

// B.java 
package b;   //<-- intermediate subclass
import a.A;
public class B extends A {
}

// C.java
package c; //<-- different package 
import b.B;
public class C extends B  { // <-- C is an indirect sub class of A 
    void testIt(){
        a++;
        System.out.println( this.a );//<-- Inherited from class A
    }
    public static void main( String [] args ) {
        C c = new C();
        c.testIt();
    }
}

它会打印出1。

正如你所看到的,属性 a 从子类 C 中是可访问的。

如果您向我们展示您正在尝试的代码,我们可以找出您困惑的地方。


1
让我猜猜,你应该忘记了一个 import 声明,就像这样:import b.B - OscarRyz
1
这将是相当困难的,因为大多数编译器会抱怨扩展类不存在。 - Random

0
也许问题在于他试图访问其他实例的受保护字段而不是自己的。就像这样:

package a;
public class A{
    protected int a;
}

package b;
public class B extends A{

}

package c;
public class C extends Bpublic void accessField(){
        A ancient = new A();
        ancient.a = 2;  //That wouldn't work.

        a = 2;   //That works.
    }


}

OP 似乎已经解决了。 - Erick Robertson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接