Java中的间接子类无法访问的超类中的受保护成员

Posted

技术标签:

【中文标题】Java中的间接子类无法访问的超类中的受保护成员【英文标题】:Protected members in a superclass inaccessible by indirect subclass in Java 【发布时间】:2011-02-18 17:20:21 【问题描述】:

为什么在 Java 中,不同包中的间接子类无法访问超类的受保护成员?我知道不同包中的直接子类可以访问超类的受保护成员。我认为任何子类都可以访问其继承的受保护成员。

编辑

对不起新手错误,子类可以访问间接超类的受保护成员。

【问题讨论】:

如果你能举个具体的例子就更容易理解你的意思了。 他的意思是在程序集a1中有一个类a。这个类有一个受保护的成员。但是,我认为,他无法从扩展程序集 a2 中的 a 的 b 类访问受保护的成员。 不,他的意思是他不能从扩展类a的扩展类b的a2中的类c访问受保护的成员。 “间接子类”是什么意思?你的意思是孩子的孩子吗?还是什么? 抱歉,由于代码的敏感性,我无法发布代码。但 Oscar 是对的,这是一个被遗忘的进口声明。 【参考方案1】:

也许你有点困惑。

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

// 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 访问。

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

【讨论】:

让我猜猜,你应该忘记了 import 声明,如:import b.B 这将是相当困难的,因为大多数编译器会抱怨扩展类不存在。【参考方案2】:

也许问题是他试图访问其他实例的受保护字段,而不是他的。 比如:

package a;
public class A
    protected int a;


package b;
public class B extends A



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

        a = 2;   //That works.
    


}

【讨论】:

OP 似乎已经想通了。

以上是关于Java中的间接子类无法访问的超类中的受保护成员的主要内容,如果未能解决你的问题,请参考以下文章

超类中的受保护方法在不同包中的子类中是不是可见? [复制]

无法访问基类中的受保护成员 [重复]

是否可以在 C++ 中的超类中拥有子类的成员

为啥我不能访问静态多态派生类中的受保护成员?

访问派生类中的受保护成员

访问子类中的超类变量/方法