欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

抽象类可以被new实例化,直接创建抽象类对象吗?

程序员文章站 2022-06-16 17:02:17
...

抽象类可以被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的无参构造方法。”

相关标签: 抽象类