0

可以从没有子类名的父类实例化子对象。

例如,我有下一节课:

public class A {
   protected int a;

   public A1() {
       a = 0;
   }

   public int getA() {
       return a;
   }

   public static A getObject() {
       // some code which I need to write
   }
}

public class A1 extends A {
    public A1() {
        a = 5;
    }
}

public class A2 extends A {
    public A2() {
        a = 10;
    }
}

使用示例:

A a = A1.getObject();
a.getA(); // return 5

a = A2.getObject();
a.getA(); // return 10

a = A.getObject();
a.getA(); // return 0

A1、A2 并不是所有的子类。可能有无限数量。

我如何编写 getObject() 方法来创建 A 类子实例。

PS:

我只需要初始化子类对象,但是有大量子类,我不会为所有子类调用“new”,也不会编写静态方法来初始化它,而且所有子类都有相同的构造函数。我无法从父级创建子实例是很大的缺陷。

4

2 回答 2

2

当你写的时候A a = A1.getObject(),你确实使用了子类名(A1)。所以a)你的问题是误导性的,b)你为什么不能写A a = new A1()

如果你想写A1.getObject(),那么你可以getObject()在 A1 类中重新定义:

public class A1 extends A {
   public static A getObject() {
     return new A1();
   }

}

如果不重新定义,就无法getObject()在类 A 中声明,以便它返回不同类的对象,因为A a = A1.getObject()会编译为A a = A.getObject().

于 2012-06-05T07:04:15.300 回答
0
class A
{
   protected int a;

   public A()
   {
       a = 0;
   }

   public int getA()
   {
       return a;
   }

   public static A getObject(Class c) throws Exception
   {
        A obj = (A)c.newInstance();
    return obj;     
   }
}

class A1 extends A
{
    public A1()
    {
        a = 5;
    }
}

class A2 extends A
{
    public A2()
    {
        a = 10;
    }
}
class Test{
    public static void main(String args[]) throws Exception
    {
        A a = A1.getObject(A1.class);
        System.out.println(a.getA()); // return 5

        a = A2.getObject(A2.class);
        System.out.println(a.getA()); // return 10

        a = A.getObject(A.class);
        System.out.println(a.getA()); // return 0
    }
}
于 2012-06-05T07:03:45.353 回答