在运行时获取父实例

时间:2015-04-16 12:48:39

标签: java

我试图从objects user1 toString() user2super开始Object但是当我使用user1时,它指的是super.objects.get(0) {1}}代替user1。我想我可能不得不使用反射,但我不确定。如果user2在其子女public abstract class Foo { public List<Object> objects = new ArrayList<>(); public void add(String string) { objects.add(string); } @Override public String toString() { //This line is broken: Object object = super.objects.get(0); } } 中,我如何获得public class User extends Foo {}

public static void main(String args[]) {
    User user1 = new User();
    User user2 = new User();
    user1.add(user2);
    user2.toString();
}

&GT;

{{1}}

&GT;

{{1}}

2 个答案:

答案 0 :(得分:2)

如果您的objects字段为public(不良做法!),protected或受包保护(无显式访问修饰符),您的子类将能够直接访问它(如果在最后一个案例的同一个包内)。

来自super的{​​{1}}次调用将返回Foo的实例,因为Object未明确扩展任何类,因此它会扩展Foo

您只需将Object覆盖实施为toString()return String.valueOf(objects) - 在第二种情况下检查空/ String.valueOf(objects.get(myIndex))

该方法将在运行时动态解析,可以从null实例调用,从而表示User或索引的任何对象。

这是一个简单的自包含示例,打印出整个集合:

objects

这将打印出public class Main { public static void main(String[] args) { System.out.println(new Bar()); } static class Foo { // package-protected field. A Bar instance will have access here. List<Object> objects; @Override public String toString() { // printing representation of "objects" and avoiding NPE return String.valueOf(objects); } } static class Bar extends Foo { // overriding default constructor and initializing/populating "objects" Bar() { objects = new ArrayList<Object>(); objects.add(1); } } }

<强>侧面注意

此外,返回[1]的方法实际上应该返回String。 你的String覆盖没有。

答案 1 :(得分:0)

该行正常工作,因为Foo没有声明超类,因此隐式子类Object

如果您想使用objects中存储的Foo,只需访问Object object = objects.get(0);

即可