使用变量类实例化抽象类

时间:2019-03-12 10:38:01

标签: java abstract

出于明显的原因,我们不能像这样直接实例化抽象类:

AbstractObj obj = new AbstractObj(); 

其中AbstractObj是以下形式的类:

public abstract class AbstractObj {
//... Body omitted 
}

但是,如果我们有扩展类,例如:

public class ConcreteObj extends AbstractObj {
//... Body omitted
}

public class AnotherObj extends AbstractObj {
//... Body omitted
}

是否可以通过以下方式实例化对象?这根据传入的变量的类来确定必须使用哪个构造函数。现在假设o1和o2的类型相同。

protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2){
    AbstractObj delta = ...?
}

例如,在上面,如果o1是ConcreteObj类型,是否可以在运行时识别它是否为这种类型并使用适当的构造函数?

2 个答案:

答案 0 :(得分:1)

这里:

protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2){
   AbstractObj delta = ...?
}

您可以使用o1获得o1.getClass()的具体类。然后,如果此具体类具有默认构造函数,则可以使用Class.newInstance()进行调用:

protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2) throws IllegalAccessException, InstantiationException{
   AbstractObj delta = o1.getClass().newInstance();
}

答案 1 :(得分:0)

您可以使用instanceof语句。您可以将o1强制转换为ConcreteObj并使用此类的方法或字段。

if(o1 instanceof ConcreteObj){
  //((ConcreteObj)o1).someMethod();
}