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