抽象类是否可以实例化讨论


1. 抽象类可以实例化吗?
Answer:(1)、首先,抽象类是不可以实例化的,但只是不可以传统做法中的通过new来进行实例化,而是通过父类的应用来指向子类实例间接地实现父类的实例化,因为子类在实例化之前,一定会优先实例化它的父类。这样创建了继承抽象类的子类对象,也就是把其父类(抽象类)给实例化了。
代码如下:
父类:public abstract class B {
private String str;
//B类的有参构造器
public B(String a){
System.out.println("父类已经被实例化");
this.str=a;
System.out.println(str);
}
public abstract void play();//抽象方法
}
子类:
public class C extends B{
public C(String c){
super(c);
System.out.println("子类已经被实例化");
}
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("我实现了父类的方法");
}
public static void main(String[] args){
B c=new C("c");
}
}
(2)、接口是不可以被实例化的,因为接口没有构造函数;
(3)、补充:
Calendar中的getInstance():Calendar抽象父类,getInstance()子类
Calendar Cal=Calendar.getInstance();
 Calendar 是抽象类不能通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInstance()中所获的实例其实就是一个“GreogrianCalendar”对象;
GreogrianCalendar就是Calendar 的子类,它实现了Calendar 里面的抽象方法。通过父类的引用来指向子类的实例间接地实现父类的实例化。同时,使用getInstance()有诸多好处:1.new一定要生成一个新的对象,分配内存;getInstance()则不一定要再次创建,它可以把一个已经存在的引用给你使用,这在效能上优于new;2.new创建后只能当次使用,而getInstance()可以跨栈区域使用。所以getInstance()通常是创建static静态实例的方法;

你可能感兴趣的:(个人总结)