在Java中,如何从父对象的方法访问子对象的私有静态属性?

5

以下是一个例子:

class Parent {
    protected int A;

    public void displayA() {
        System.out.println(A);
    }
}

class Child extends Parent {
    protected static int A=2;
}

Child intance = new Child();
intance.displayA();

=> return null !!!

如何从父方法中获取子属性?

谢谢 :)

2个回答

3
您可以在Child的构造函数中设置变量A:
class Child extends Parent {
   // protected static int A=2; // this redeclares the variable -- it's a different variable

   public Child() {
      A = 2;
   }
}

但我认为最好给父变量设置一个getter和setter,然后根据需要从子类或父类进行设置或获取。在我的看法中,这比直接操作字段更好,因为您可以监视字段的更改并在数据被更改时执行操作,以避免其不当使用。

其他建议:学习并坚持Java命名规则。此外,您发布的代码中存在许多粗心的错误,包括拼写错误。如果您要求他人免费帮助您,请出于同样的尊重回应,提出一个良好的问题和真实的代码,以便不会使帮助您变得更加困难。


2

如果您在Child类构造函数中设置A的值而不是重新声明变量,则父类应该能够获取该值。

上面的实例问题在于您在子类中重新声明了变量,而不是只改变了超类中变量的值。

您将Child变量声明为静态变量的原因是什么?如果您只需要该类变量的值,则可以直接引用它。然而,更好的方法是让子类设置您想要的变量值,然后让超类引用该变量(可能使用getter),以便子类设置了该值。


是的,但我希望A仅在子类中为静态。 - nonozor
3
“@nonozor:那完全是疯狂的。你不能让一个静态字段试图覆盖一个非静态字段。把这件事放在脑后吧。考虑购买一本不错的Java教材,仔细阅读前几章,这将对你有很大帮助。顺便说一句,Elliott的建议很好。” - Hovercraft Full Of Eels
1
@nonozor,你可以提供一个获取值的抽象方法,如 public abstract int getA()。然后在超类中调用它。当子类实现该方法时,只需返回 A 的值即可。 - Elliott Hill
非常感谢你,艾略特。这正是我期望的答案,而且如果我用这种方式提问,也不算完全疯狂,因为我的需求正是我所解释的。只有艾略特给出了正确的答案 :) - nonozor

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