介面能做到的事,抽象類都能做,差別僅在語法層面。那么介面的意義是什么?僅僅為了照顧現實的復雜性?
人和狗都可以移動,都屬于動物,所以移動速度寫到抽象類里邊。
人和飛機都可以移動,人屬于動物,飛機屬于機械,所以移動速度寫到介面里邊。
這是抽象類的寫法:
public class test {
public static void main(String[] args) {
horse myhorse = new horse();
myhorse.eat();
myhorse.travel();
System.out.println(Animal.getValue());
System.out.println(Animal.getDouble());
System.out.println(myhorse instanceof horse);
System.out.println(myhorse instanceof Animal);
}
}
class horse extends Animal{
@Override
public void eat() {
System.out.println("to eat");
}
@Override
public void travel() {
System.out.println("to travel");
}
}
public abstract class Animal {
public abstract void eat();
public abstract void travel();
public static int getValue() {
return 11;
}
public static double getDouble() {
return 0.92;
}
}
這是介面的寫法:
public class test {
public static void main(String[] args) {
horse myhorse = new horse();
myhorse.eat();
myhorse.travel();
System.out.println(myhorse.thedefault());
System.out.println(Animal.getValue());
System.out.println(Animal.getDouble());
System.out.println(myhorse instanceof horse);
System.out.println(myhorse instanceof Animal);
}
}
class horse implements Animal{
public void eat() {
System.out.println("eat");
}
public void travel() {
System.out.println("travel");
}
}
public abstract interface Animal {
public abstract void eat();
public abstract void travel();
public default String thedefault() {
return "介面提供的默認方法";
}
public static int getValue() {
return 10;
}
public static double getDouble() {
return 0.98;
}
}
uj5u.com熱心網友回復:
實作類只能繼承一個抽象類但可以實作多個介面。介面容易擴展uj5u.com熱心網友回復:
你這個是一個高深的問題不確定原來怎么就出來的抽象類和介面,下面是我的猜測。
在C++時期,類是可以多重繼承的,但是多重繼承也帶來了不少問題,各種作用域問題,訪問混亂問題
所以Java就改成了單一繼承,但是單一繼承也導致有些東西無法整合在一起,就像是原來有一個列印機,還有一個復印機,后來出現一個列印復印一體機。麻煩了,搞不定了。于是才祭出了介面,來做多重繼承。
從上面的例子看,似乎介面才是終極方向,特可能會替換掉抽象類。就像很多框架做的,類似OSGI,每個bundle都是發布介面出去,給外部使用。
這個世界很復雜,可能不是抽象類和介面可以解決的,也許只是一堆方法的堆積,也許在計算機的世界還在孕囊另外一個東西,
等他出來的時候,抽象類和介面都會被碾壓。
uj5u.com熱心網友回復:
取代不了,java是單一繼承,介面可以同時實作多個。當然抽象類里也可以宣告和介面一樣的方法,但是導致抽象類過于臃腫,不靈活,耦合度過高,不利于擴展。同樣的,介面也取代不了抽象類,雖然java8以后介面可以定義defalt方法了,但是還不支持非靜態屬性,而且介面方法都是public,不能隱藏不想暴露的細節,做不到抽象類能做到的一些功能。
uj5u.com熱心網友回復:
介面就是一個功能簡化版的可以多繼承的抽象類。我感覺是這樣。
另外,類單繼承避免了父類同名方法的問題,但是介面多繼承的同名方法怎么說。
uj5u.com熱心網友回復:
1. java類(及抽象類)是單一繼承(有利于層次劃分),介面可以同時實作多個(有利于功能擴展)。2. 抽象類一般是為了同類事物的共性而設計,介面一般是為了統一標準(可以是不同類事物)而設計。
uj5u.com熱心網友回復:
面向物件,就要用物件的思想來考慮。一個類A繼承某一個類B,說明B是A的爹。A繼承B的所有財產(除了B寫的遺囑里不讓A繼承,即private),如果B里有抽象方法,即B傳給A的武功秘籍,A照著練,練成什么樣由A自己決定。
在Java中一個物件只能有一個爹。(在C++中可以有多個爹,如親爹、后爹、干爹,搞得關系復雜)
一個類A實作某一個介面C,說明C是A的師父,他從C處學到了某些武功(實作的方法),至于他學到后怎么練,也是A自己的事。
一個類可以有多個師父,從不同的地方學習不同技巧。
在實際程式中,為什么要有介面呢? 這就是明確告訴你,這里面不準有實作,只準定義。而且介面是要對外公開的,寫入doc檔案,而類一般不會對外公開,除了工具類外。比如 Java 會連接 資料庫,如Mysql、Oracle、Redis、MongoDB,這些是不同的廠商,Java不可能一個個去寫連接它們的代碼、程式,而且廠商的代碼不會公開,Java也不知道怎么連接。
怎么辦呢?Java就會定義一個介面,通用的連接資料庫介面,如果某資料庫想能支持Java,就要由該資料庫廠商 自己去定義一個類,實作該介面,而Java不會去管具體的代碼實作。如果用抽象類,萬一Java在里面又加了一個漏洞攻擊的代碼,那廠商還敢使用?
在實際的專案中,介面表示規范。專案啟動后,專案分工,會由架構師或高級工程師 定義好專案 各模塊的介面、框架,然后由 初級工程師(碼農)去照著介面實作這些方法。這表示 架構師 不會寫普通簡單的業務代碼,只是定義框架介面和寫核心功能代碼。
如果換成抽象類,一是無法對外公開,即使公開了別人也會不理解這抽象類除了公開介面外,還做了些什么。另外業務程式員也會迷茫
綜上,介面是定義規范,對外公開的。抽象類表示實作了一些功能,部分功能因業務復雜還無法實作或是不確定怎樣實作,而且不對外公開。
uj5u.com熱心網友回復:
介面是一種協議,說明了物件能做哪些事,抽象類是一種“準實作”,說明了物件“大致”是怎樣做到那些事的。相比介面而言,抽象類更側重實作。
兩者之間,在某些場合下可以互換,但目前而言還不存在誰能完全替代誰的可能性
uj5u.com熱心網友回復:
介面都是抽象方法沒有物體,所以都要靠子類的實作,同名方法不會沖突。
uj5u.com熱心網友回復:
如果有需要默認實作的功能 或需要必要的實體變數 可以使用抽象類 來實作 但是不要超過兩層 多重繼承會帶來 高度耦合。所以超過兩層 就要來使用介面了。如果只想單純使用方法,使用介面即可。個人理解uj5u.com熱心網友回復:
介面取代抽象類挺好uj5u.com熱心網友回復:
這么說的話,那java的類別庫起了個壞頭。你看JFrame到Object中間經過多少次繼承。
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Window
java.awt.Frame
javax.swing.JFrame
uj5u.com熱心網友回復:
當然如果我覺得技術高,即使高度耦合也能分清楚類之間的關系,不錯亂也是可以的,而且技術沒有好壞,只有適合對不同的問題有不同的方法,你覺得呢??
uj5u.com熱心網友回復:
取代不了,java是單一繼承,介面可以同時實作多個。當然抽象類里也可以宣告和介面一樣的方法,但是導致抽象類過于臃腫,不靈活,耦合度過高,不利于擴展。
同樣的,介面也取代不了抽象類,雖然java8以后介面可以定義defalt方法了,但是還不支持非靜態屬性,而且介面方法都是public,不能隱藏不想暴露的細節,做不到抽象類能做到的一些功能。
介面就是一個功能簡化版的可以多繼承的抽象類。我感覺是這樣。
另外,類單繼承避免了父類同名方法的問題,但是介面多繼承的同名方法怎么說。
你可以試下,介面在jdk8以前是沒得方法體的,所以說不管它覆寫誰的得到的結果只有一個,就是new出來的實作類,多繼承就不同,因為繼承的類是有方法體的所以。。。。jdk8是有靜態方法的,具體的沒試
uj5u.com熱心網友回復:
肯定取代不了啊轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/74636.html
標籤:Java SE
