1. 程式人生 > 其它 >Java基本總結(上)

Java基本總結(上)

關於java語言設計理念

下面的知識是關於java語言從設計角度出發的一些知識點。

抽象類與介面的區別是什麼

首先來看看介面的定義:介面,在JAVA程式語言中是一個抽象型別,主要是抽象方法的集合,介面中的變數定義必須為public static final型別。介面通常以interface來宣告。

抽象類: 從面向物件的角度來講,我們知道所有的物件都是通過類來描繪的,但是反過來卻不是這樣,並不是 所有的類都是用來描繪物件的,如果一個類中沒有包含足夠的資訊來描繪一個具體的物件,這樣的類就可以認為是抽象類。

抽象類除了不能例項化物件之外,類的其它功能依然存在,成員變數、成員方法和構造方法的訪問方式和普通類一樣。由於抽象類不能例項化物件,所以抽象類必須被繼承,才能被使用。

從定義角度來看,介面和抽象類是兩個幾乎沒有太多聯絡的設計。介面只是一個抽象方法的集合。而抽象類本質上是一個類,但是它不能被例項化,但是類具備的大多特性抽象類都有。抽象類和interface在Java語言中都是用來進行抽象的,他們除了都是一個用於抽象的東西之外幾乎沒有任何相同之處。事實上對於一個java裡的類來說,無外乎由兩種成分組成,即變數和方法(靜態程式碼塊可以寫在類裡面但從實際效果角度並沒有影響一個類)。因此介面的功能僅僅包含其中一部分,即方法的集合以及一部分靜態成員變數。這樣來看,介面是一種非常高的抽象,裡面定義的東西被認為是不會改變的。抽象類裡面就可以定義普通的成員變數,抽象類的抽象程度相對介面來說會低一點。

但是對於java來說個人認為設計介面的最大原因是為了支援多繼承,從這個角度來說,抽象類和介面最重要的區別應該是在使用的時候的區別:

其他的區別就非常多了,本質上是一些java語言規則方面的區別。例如:抽象類可以寫方法實現,介面也可以寫方法實現,不過需要加上default修飾,等等。

問題:什麼時候用介面什麼時候用抽象類?

抽象類的關鍵好處在於 能夠實現面向物件設計的一個最核心的原則OCP(Open-ClosedPrinciple)。因此當我有一部分內容是不想讓子類修改的,但是子類又都通用,同時各個自樂又有自己的特點,那麼就適合使用抽象類。

在面向物件領域,抽象類主要用來進行型別隱藏。 我們可以構造出一個固定的一組行為的抽象描 述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現為所有可能的派生類。模組可以操作一個 抽象體。由於模組依賴於一個固定的抽象體,因此它可以是不允許修改的;同時,通過從這個抽象體派生,也可擴充套件此模組的行為功能。熟悉OCP的讀者一定知 道,為了能夠實現面向物件設計的一個最核心的原則OCP(Open-Closed Principle),抽象類是其中的關鍵所在。

符合開發封閉原則,我可以對抽象出來的類進行擴充套件,但是隻要是這個抽象類的子類,那麼他必然能夠。

從語法層面上講,java單繼承多實現,而介面可以多實現。

java為什麼不支援多繼承

典型的支援多繼承的語言就是C++。在OOP的世界裡,單根繼承意味著所有的類都會有一個最上面的終極類,java裡面這個類就是Object。單根繼承既可以說是一門語言的特性,也可以說是一門語言的一個選擇。從純粹技術的角度來說,java也可以做到多繼承,只是如果那樣的話那麼java就不會再是我們今天所認識的java。除此之外,單根繼承還有下面這些優點:

單根繼承的優點1:相容性

單根繼承帶來的一個效果就是所有的物件歸根到底都是相同的基本型別。這帶來的好處就是任何java出現的新類庫中,相容性的問題會大大降低,這一點很好理解。但是在C++之中,總是會有一些不相容的介面,這雖然帶來了一定的靈活性,但是對於不相容的介面,往往就是要通過多繼承來解決。

單根繼承的優點2: 便利性

因為單根繼承,所有的物件都會具備某些一樣的功能,比如所有的物件都會有hashcode方法,有euqals方法。因此拿到一個物件時,無論這個物件從哪裡來,我們都知道可以對他執行某些基本操作。引數傳遞也得到了簡化。

單根繼承的優點3: 垃圾回收

單根繼承會使得垃圾回收變得簡單很多。因為所有物件都保證具有其型別資訊,因此不會因為無法確定型別資訊而帶來不便。垃圾回收正是java相對於C++的重要改進之一。

https://www.bilibili.com/video/BV1qL411u7eE?from=search&seid=7067890005246929445&spm_id_from=333.337.0.0