如何使用不同的类作为一个类的成员?

时间:2015-11-01 12:12:58

标签: java inheritance placeholder

我有一个超类A,两个类X,Y继承自A和另一个B类,我将使用X,Y作为成员。

public class A {
    public String strA;
}

public class X extends A {
    public String strX;
}

public class Y extends A {
    public String strY;
}

public class B {
    public A member;

    public B(A member) {
        this.member=member;
    }
}

public static void main() {
    X x = new X();
    Y y = new Y();

    B b1 = new B(x);
    B b2 = new B(y);

    System.out.println(b1.strA); //works
    System.out.println(b1.strX); //does not work!
    System.out.println(b2.strA); //works
    System.out.println(b2.strX); //does not work!
}

我该如何解决这个问题?

我的方法是使用B中成员的数据类型作为占位符吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您的代码无法按照Jon Skeet的说法编译,因为您正在尝试访问B字段中的字段。

要编译,代码将是

System.out.println(b1.member.strA); //works

您必须在此处使用继承实例中的字段,明确地展示您的member引用。

如果您使用的是对母类的引用,它只会向您显示可从母类访问的字段。

在这种情况下,只有strA引用才能访问A

解决方案

System.out.println(((X)b1.member).strX);

如您所见,首先我们将b1.member投射到X,然后我们调用strX字段。

如果您想确保b1.memberX的实例,请使用if this test

if (b1.member instanceof X) System.out.println(((X)b1.member).strX);