1. 程式人生 > >通過介面抽象類“建立”物件

通過介面抽象類“建立”物件

前言

首先宣告,用介面或者抽象類例項化一個物件是不可能的,錯誤的。

介面、抽象類實現注意點

  1. Interface
    • 屬性預設都是 public static final
    • 方法預設都是 public abstract
    • 都不用顯示宣告
  2. 抽象類
    1. 至少含有一個方法是abstract修飾的

Get right to the point

現在,我們動手解釋下為什麼用介面或者抽象類例項化物件是錯誤的,以及該如何重新理解這句話。

首先,我們宣告一個介面:
TIM截圖20180821202017.png-14.1kB
再宣告一個抽象類:
TIM截圖20180821202055.png-9.1kB

在eclipse中當我們為抽象類或者介面例項化物件時,顯然它會報錯:
TIM截圖20180821202805.png-8.3kB
報錯顯示,這兩個是抽象的,是不能例項化的。

如此,從直觀角度來看例項化介面和抽象類是肯定不對的。

但是我相信很多朋友是因為看到了如下這種情況才會有疑惑的:
這裡寫圖片描述
很多朋友會說,是啊,你看它這不是建立了一個介面的物件麼?
問題便出在了這裡,先暫且不急,我們再嘗試在IDEA中“建立”物件:
TIM截圖20180821202246.png-11.1kB

TIM截圖20180821202302.png-10.3kB

我們會發現IDEA自動為我們補全了建立匿名內部類的程式碼,並且要求我們實現抽象方法,同時宣告一個引用來指向這個匿名內部類生成物件。

所以現在想想,平常我們經常聽到人問interface能建立一個物件,從經歷來看,主要存在兩方面的誤解:

  1. 錯把引用當做物件
    image_1cle7s8cs1b1c6srrfo617rrg3t.png-2.3kB
    新人錯誤的認為這就是建立了一個介面的物件,殊不知,這只是聲明瞭一個引用。
    我們來正確理解下平常的物件的宣告語句:
    image_1cle8042hv6mh06hqqlr31cha4a.png-2.7kB


    我們知道”=”號右邊先執行,即 new 了一個Myclass物件,這時我們無法對這個物件操作,所以又聲明瞭一個名為 myclass 的引用指向這個物件,這樣我們就可以通過操作 myclass 來操作物件。在這裡,物件和對“物件”的引用大家要分清,這是兩個概念。

  2. 從來不能建立一個介面的物件,建立介面物件本身就是一個錯誤的說法。
    TIM截圖20180821204726.png-7.6kB
    對於這段程式碼,我們正確的解讀是:
    我們通過一個內部類實現了接口裡的抽象方法並且返回一個內部類物件,之後我們通過介面的引用捕獲這個物件。

Extension Problems:
但是,根據上面的解釋,又會有新的問題出現:

  1. 怎麼才算是建立(例項化)物件?
    答:所謂例項化一個物件,在java中從本質上來講是從堆裡申請到記憶體分配給這個物件,一個物件應該是一個存在記憶體中的實體,裡面儲存著屬性和方法等。

  2. 為什麼會用一個介面的引用去捕獲這個物件?為什麼不用類的引用去捕獲?
    答:這個涉及到轉型的知識點,這樣做的作用請參考我另一篇部落格。