抽象类可以被new实例化,直接创建抽象类对象吗?
抽象类可以被new实例化,直接创建抽象类对象吗?
抽象类可以拥有构造方法,那么它可以被实例化吗?为什么在代码中可以直接用“new”一个抽象类?
首先我的结论是:抽象不能实例化。通常用“new + 抽象类型”的形式产生的对象,实际上该对象的类型也不是抽象类类型。下面看我的根据和论证方法。
方法:通过instanceof和getClass方法来判定“new”出的抽象类。
Anima抽象类
public abstract class Animal {
public String words = "我是Animal";
public Animal (){
System.out.println("Animal已经被实例化了");
}
public abstract void move();
}
定义了一个String变量和一个abstract方法,接下来看下面的Dog类,注意,该Dog类并未继承Animal类。
Dog类(未继承Animal抽象类)
public class Dog {
public Dog(){
System.out.println("Dog的无参构造方法。");
}
Animal animal = new Animal() {
@Override
public void move() {
if (animal instanceof Animal){
System.out.println("animal是Animal类或其子类");
}
System.out.println("对象的类型是"+animal.getClass());
}
};
}
可以看到在Dog中直接声明并new了一个抽象类,并必须重写其抽象方法move。在move里使用了instanceof判断animal指向的对象是否为Animal或其子类。而getClass获得该对象的类型。
测试类
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.animal.move();
System.out.println(dog.animal.words);
}
}
输出
Animal已经被实例化了
Dog的无参构造方法。
animal是Animal类或其子类
对象的类型是class com.xmx.csdn.abstractbeinstance.Dog$1
我是Animal
可以看到,
第一:instanceof的if判断成功通过,说明animal所指向的对象是Animal或其子类,而且也看到可以调用父类的words属性并打印输出。
第二:animal.getClass得到的结果是class com.xmx.csdn.abstractbeinstance.Dog$1,说明对象实质上Dog类型,这与 我们认为的Animal animal = new Animal()不一致。
总结:直接new一个抽象类所产生的对象其实并不是抽象类对象,而是一个继承了抽象类的对象,且该对象与所在类的类型一致,也就是,new Animal的对象是由Dog继承Animal产生的对象,并且通过Dog的无参构造输出只有一个的结果来看,实例化Dog的对象和new Animal所产生的对象是同一个对象否则应该输出两个“Dog的无参构造方法。”
下一篇: 海产品干货有哪些,看看你都你知道吗