【问题标题】:Child Instantiate from parent class子类从父类实例化
【发布时间】:2012-06-05 06:27:24
【问题描述】:

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

例如,我有下一节课:

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”,我也不会编写静态方法来初始化它,所有孩子都有相同的构造函数。我不能从父级创建子实例是很大的不足。

【问题讨论】:

  • 如果您在编译时不知道所有可能的子类,那么您需要一种方法在运行时弄清楚这一点。就目前而言,您所要求的似乎有点尴尬。您能否提供更多有关您遇到的问题的信息?
  • 我只需要编写超类静态方法,该方法将调用子类的构造函数,从中调用该静态方法。我认为,实现它的唯一方法是调用 getStackTrace() ftom Thread 并使用反射创建实例。但它的方式非常复杂。也许我可以简单地意识到它?
  • 调用 A1.getObject() 时,在堆栈跟踪中找不到对 A1 的引用。
  • 阿列克谢·凯戈罗多夫,Я понял。 И что, получается нет способов?
  • Nik,请尝试用英文发表评论。每个人都很容易理解你。未来的访问者可以通过这种方式轻松地从您的问题中学习。

标签: java class inheritance reflection instance


【解决方案1】:

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

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

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

}

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

【讨论】:

    【解决方案2】:
    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
        }
    }
    

    【讨论】:

    • 为什么不用反射来实例化c?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2021-08-28
    • 2013-05-07
    • 2014-04-04
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多