在Java中抽象類真的不能實例化么? 在學習的過程中,發(fā)現(xiàn)了一個問題,抽象類在沒有實現(xiàn)所有的抽象方法前是不可以通過new來構建該對象的,但是抽象方法卻是可以有自己的構造方法的。這樣就把我搞糊涂了,既然有構造方法,又不可以通過new來創(chuàng)建,那么抽象類在沒變成具體類的時候究竟可不可以實例化呢? 通過上網(wǎng)查找資料、引用:blog.sina.com.cn/s/blog_7ffb8dd5010120oe.html 抽象類其實是可以實例化的,但是他的實例化方式不是通過new方式來創(chuàng)建對象,而是通過父類的引用來指向子類的實例來間接地實現(xiàn)父類的實例化(因為子類要實例化前,一定會先實例化他的父類。這樣創(chuàng)建了繼承抽象類的子類的對象,也就把其父類(抽象類)給實例化了).但是:接口是不能被實例化的(接口壓根就沒有構造函數(shù))。 代碼如下: abstract class B {
private String str;
public B(String a) {
System.out.println('父類已經(jīng)實例化');
this.str=a;
System.out.println(str);
}
public abstract void play();
}
public class A extends B{
public A(String a) {
super(a);
System.out.println('子類已經(jīng)實例化');
}
@Override
public void play() {
System.out.println('我實現(xiàn)了父類的方法');
}
public static void main(String[] args) {
B aa=new A('a');
}
}
結(jié)果如下: 父類已經(jīng)實例化
另外: Calendar Cal
= Calendar.getInstance();
Calendar是抽象類不能直接通過new對象,但是提供的靜態(tài)getInstance()就是給Calendar創(chuàng)建對象。 從Calendar.getInstance() 中所獲得的實例其實就是一個 'GreogrianCalendar' 對象 GreogrianCalendar就是Calendar的子類,他實現(xiàn)了Calendar里面的抽象方法。過父類的引用來指向子類的實例來間接地實現(xiàn)父類的實例化。同時,使用getInstance()有諸多好處: 1。 new 一定要生成一個新對象,分配內(nèi)存;getInstance()則不一定要再次創(chuàng)建,它可以把一個已存在的引用給你使用,這在效能上優(yōu)于new; 2。new創(chuàng)建后只能當次使用,而getInstance()可以跨棧區(qū)域使用,或者遠程跨區(qū)域使用。所以getInstance()通常是創(chuàng)建static靜態(tài)實例方法的。 |
|
來自: Levy_X > 《JAVAWEB學習資料》