Java中實現(xiàn)接口與繼承的區(qū)別及說明
Java實現(xiàn)接口與繼承的區(qū)別
首先,先來了解一下什么是接口和繼承。
接口一般是使用interface來定義的。
接口定義同類的定義類似,分為接口的聲明和接口體,其中接口體由常量定義和方法定義兩部分組成。
定義接口的基本格式
如下:
[修飾符] interface 接口名 [extends 父接口名列表]{ [public] [static] [final] 常量; [public] [abstract] 方法; }
- 修飾符:可選,用于指定接口的訪問權(quán)限,可選值為public。如果省略則使用默認(rèn)的訪問權(quán)限。
- 接口名:必選參數(shù),用于指定接口的名稱,接口名必須是合法的Java標(biāo)識符。一般情況下,要求首字母大寫。
- extends 父接口名列表:可選參數(shù),用于指定要定義的接口繼承于哪個父接口。當(dāng)使用extends關(guān)鍵字時,父接口名為必選參數(shù)。
- 方法:接口中的方法只有定義而沒有被實現(xiàn)。
例如,定義一個用于計算的接口,在該接口中定義了一個常量PI和兩個方法
具體代碼如下:
public interface CalInterface { final float PI=3.14159f;//定義用于表示圓周率的常量PI float getArea(float r);//定義一個用于計算面積的方法getArea() float getCircumference(float r);//定義一個用于計算周長的方法getCircumference() }
此時需要注意的是:
與Java的類文件一樣的,接口文件的文件名必須與接口名相同。
繼承:繼承是Java面向?qū)ο缶幊碳夹g(shù)的一塊基石,因為它允許創(chuàng)建分等級層次的類,它是一種子類繼承父類的特征和行為,使得子類對象(實例)具有父親的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。
生活的繼承:
兔子和羊?qū)儆谑巢輨游镱?,獅子和豹屬于食肉動物類。
食草動物和食肉動物又是屬于動物類。
所以繼承需要符合的關(guān)系是:is-a,父類更通用,子類更具體。
雖然食草動物和食肉動物都是屬于動物,但是兩者的屬性和行為上有差別,所以子類除了會具有父類的一般特性也會具有自身的特性。
繼承的特性
- 子類擁有父類非private的屬性、方法;
- 子類可以擁有自己的屬性和方法,即子類可以就自己的功能需求對父類進行擴展;
- 子類可以用自己的方式實現(xiàn)父類的方法;
- Java的繼承是單繼承,但是是可以多重繼承的,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如 A 類繼承 B 類,B 類繼承 C 類,所以按照關(guān)系就是 C 類是 B 類的父類,B 類是 A 類的父類,這是 Java 繼承區(qū)別于 C++ 繼承的一個特性;
- 提高了類之間的耦合性,但是也會帶來一些問題,如果耦合度高的話會造成代碼之間越緊密,代碼的獨立性就越差。
- 在Java中,接口的實現(xiàn)和繼承的實現(xiàn)很類似的,寫法上是幾乎是一致的,就是關(guān)鍵字這一部分不一樣,即實現(xiàn)接口使用的關(guān)鍵字為implements,而繼承使用的關(guān)鍵字為extends。
代碼如下:
實現(xiàn)接口的代碼:
public class ButtonListener implements ActionListener {}
實現(xiàn)接口類型的寫法與解釋:
//事件處理類 //實現(xiàn)接口一定要實現(xiàn)(重寫)接口中所有的抽象方法 //實現(xiàn)接口(繼承):implements //public class 子類 implements 接口,接口,,{} //一個子類后面能夠?qū)崿F(xiàn)很多個接口的 //實現(xiàn)接口一定要實現(xiàn)(重寫)接口中所有的抽象方法 //ActionListener只是一個接口,也可以換成其他的接口的,所以下面必須是public void actionPerformed(ActionEvent e)的,抽象方法需與接口保持一致的
實現(xiàn)接口的代碼例子:
public class ButtonListener implements ActionListener { //引用傳遞 //定義文本框變量,用來保存?zhèn)鬟f過來的文本框?qū)ο? public JTextField jt; //動作處理方法 public void actionPerformed(ActionEvent e){ //獲取文本框內(nèi)容 String userName = jt.getText(); //比較內(nèi)容是否一樣:equals //比較地址是否一樣:== if("123".equals(userName)){ System.out.println("yes"); JFrame jf = new JFrame(); jf.setSize(400, 400); jf.setTitle("對話框"); JLabel jl = new JLabel("賬號密碼驗證成功"); jf.add(jl); jf.setLocationRelativeTo(null); //設(shè)置可見 jf.setVisible(true); } else{ System.out.println("no"); JFrame jf = new JFrame(); jf.setSize(600, 600); jf.setTitle("對話框"); JLabel jl = new JLabel("賬號密碼驗證失敗",JLabel.CENTER); jf.add(jl); jf.setLocationRelativeTo(null); //設(shè)置可見 jf.setVisible(true); } } }
繼承的代碼:
public class UNStudent extends Student{}
繼承類型寫法與解釋
/** * 大學(xué)生類 * 繼承:extends * public class 子類(派生類) extends 父類(基類) implements 接口,接口,,{} * 繼承中父類只有一個,并不像接口一樣可以擁有很多個。 * 子類會繼承父類中的屬性和方法,私有屬性和方法不能直接使用 * @author liu */
繼承的代碼例子:
public class UNStudent extends Student{ public void printName(){ System.out.println("名字:"+getName()); } //方法重寫(覆蓋) //1.有繼承關(guān)系的兩個類之間 2.返回值類型,方法名,參數(shù)類型(個數(shù),順序)完全一樣 public void study(){ System.out.println("子類重寫父類的學(xué)習(xí)方法!"); } }
綜上所述
實現(xiàn)接口與繼承的區(qū)別
1.不同的關(guān)鍵字,即實現(xiàn)接口(implements),繼承(extends);
2.在面向?qū)ο缶幊痰臅r候只能是單繼承,但是實現(xiàn)接口可以有多個,簡單點說,就是實現(xiàn)接口可以有好多個,但是繼承的中父類只能只有一個,因為父親只有一個,這說明了繼承在Java中具有單根性,子類只能去繼承一個父類;
3.在接口中只能定義全局變量和抽象方法,而在繼承中可以定義屬性方法,變量,常量的等等…
4.當(dāng)某個接口被實現(xiàn)的時候,在類中一定要用接口中的抽象方法,而繼承中子類能隨意調(diào)用父類的屬性和方法,毫無壓力的;
5.當(dāng)你需要去調(diào)用接口時,接口中的抽象方法是一定需要寫上去的,即使在抽象方法你并不需要去實現(xiàn)什么樣的功能,但這個步驟是一定不能少的;但是在繼承中并不是這樣的,當(dāng)子類需要實現(xiàn)的功能和父類中的實現(xiàn)功能毫無差別的時候,則父類中的實現(xiàn)方法可寫可不寫,但是當(dāng)你想要在你的子類中去實現(xiàn)某些特有的功能時,這時候需要將父類中的實現(xiàn)方法去重寫,以實現(xiàn)在子類中所需要的特定功能。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
重寫hashCode()和equals()方法詳細(xì)介紹
這篇文章主要介紹了重寫hashCode()和equals()方法詳細(xì)介紹,涉及重寫equals()方法,重寫hashCode()方法,重寫equals()而不重寫hashCode()的風(fēng)險等相關(guān)內(nèi)容的介紹,具有一定借鑒價值,需要的朋友可以參考下2018-01-01springboot如何實現(xiàn)導(dǎo)入其他配置類
這篇文章主要介紹了springboot如何實現(xiàn)導(dǎo)入其他配置類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11ActiveMQ中consumer的消息確認(rèn)機制詳解
這篇文章主要介紹了ActiveMQ中consumer的消息確認(rèn)機制詳解,對于broker而言,只有接收到確認(rèn)指令,才會認(rèn)為消息被正確的接收或者處理成功了,InforSuiteMQ提供以下幾種Consumer與Broker之間的消息確認(rèn)方式,需要的朋友可以參考下2023-10-10Java 高并發(fā)二:多線程基礎(chǔ)詳細(xì)介紹
本文主要介紹Java 高并發(fā)多線程的知識,這里整理詳細(xì)的資料來解釋線程的知識,有需要的學(xué)習(xí)高并發(fā)的朋友可以參考下2016-09-09帶你了解如何使用Spring基于ProxyFactoryBean創(chuàng)建AOP代理
這篇文章主要介紹了Spring基于ProxyFactoryBean創(chuàng)建AOP代理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2021-08-08jdk環(huán)境變量配置切換jdk版本及安裝jdk后環(huán)境變量不生效問題解決辦法
這篇文章主要介紹了jdk環(huán)境變量配置切換jdk版本及安裝jdk后環(huán)境變量不生效問題解決辦法,包括配置JAVA_HOME、Path和CLASSPATH,以及如何驗證配置是否成功,文章還講解了如何切換JDK版本,并解決了安裝新JDK后環(huán)境變量配置不生效的問題,需要的朋友可以參考下2024-12-12