Java中抽象類也能實例化


在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靜態實例方法的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM