面试过程中,遇到这个问题。当时处于懵的状态,回答抽象类不能被实例化。当时觉得此事必有蹊跷,查询了一些资料了解到:
抽象类其实是可以被实例化的,但是它的实例化方式并不是通过普通的new方式来创建对象,而是通过父类的应用来指向子类的实例间接地实现父类的实例化,因为子类在实例化之前,一定会先实例化它的父类。这样创建了继承抽象类的子类对象,也就把其父类(抽象类)给实例化了。
注意:接口与抽象类非常类似,但是它不可以被实例化,因为接口压根没有构造函数。
下面将通过一个简单的Demo来展示一下:
首先,定义一个抽象类B,包含抽象方法play()
public abstract class B {
private String str;
public B(String a){
System.out.println("父类已经实例化");
this.str = a;
System.out.println(str);
}
public abstract void play();
}
然后,定义一个子类C去继承类B,并实现其中的抽象方法
public class C extends B{
public C(String c){
super(c);
System.out.println("子类已经被实例化");
}
@Override
public void play() {
System.out.println("我实现了父类的方法");
}
public static void main(String[] args){
B c = new C("c");
}
}
运行结果如下:
父类已经实例化
c
子类已经被实例化