JAVA學習總結(四)
阿新 • • 發佈:2017-11-30
服務 共同點 運行 blog 重要 程序員 ride 處理 mob 修飾符 interface 接口名{
修飾符:默認 | public
接口不能用於實例化對象。
1.接口中每一個方法也是隱式抽象的,接口中的方法會被隱式的指定為 public abstract(只能是 public abstract,其他修飾符都會報錯)。
java特點之一:單一繼承,但能實現多個接口。
註意:
IWifi wifi設備1 = new Mobile();
IWifi wifi設備2 = new Dell_Computer();
wifi設備2 可以訪問的方法:send1()和receive1();
a、在某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但無法準確知道這些子類如何實現這些方法
共同點與區別:
1.接口 interface
1.1語法:
修飾符 interface 接口名{
常量
都是抽象方法
}
修飾符:默認 | public
接口名:自定義,規則與類名相同,一般I字母打頭:wifi接口(Iwifi)
//示例: public interface Iwifi{ int COUNT=1; public abstract void send();//發送 public void receive();//接收 }
1.2接口與類的區別:
接口不能用於實例化對象。
接口沒有構造方法。
接口中所有的方法必須是抽象方法。
接口不能包含成員變量,除了 static 和 final 變量。
接口不是被類繼承了,而是要被類實現。
接口支持多重繼承。
1.3接口特性:
1.接口中每一個方法也是隱式抽象的,接口中的方法會被隱式的指定為 public abstract(只能是 public abstract,其他修飾符都會報錯)。
2.接口中可以含有變量,但是接口中的變量會被隱式的指定為 public static final 變量(並且只能是 public,用 private 修飾會報編譯錯誤。
3.接口中的方法是不能在接口中實現的,只能由實現接口的類來實現接口中的方法。
1.4、為什麽需要接口
繼承:描述事物的自然屬性和行為的復用。
接口:描述事物的社會屬性和行為的復用。
1、重要性:在Java語言中, abstract class 和interface 是支持抽象類定義的兩種機制。正是由於這兩種機制的存在,才賦予了Java強大的 面向對象能力。
2、簡單、規範性:如果一個項目比較龐大,那麽就需要一個能理清所有業務的架構師來定義一些主要的接口,這些接口不僅告訴開發人員你需要實現那些業務,而且也將命名規範限制住了(防止一些開發人員隨便命名導致別的程序員無法看明白)。
3、維護、拓展性:比如你要做一個畫板程序,其中裏面有一個面板類,主要負責繪畫功能,然後你就這樣定義了這個類。
4、安全、嚴密性:接口是實現軟件松耦合的重要手段,它描敘了系統對外的所有服務,而不涉及任何具體的實現細節。這樣就比較安全、嚴密一些(一般軟件服務商考慮的比較多)。
因為類具有“單根性”,所有的類只能有一個直接父類,通過可以實現一個類有多個父類,可以實現多重繼承。
java特點之一:單一繼承,但能實現多個接口。
1.5、接口的特點
1)、接口中的方法可以有參數列表和返回類型,但不能有任何方法體。
2)、接口中可以包含字段,但是會被隱式的聲明為static和final。
3)、接口中的字段只是被存儲在該接口的靜態存儲區域內,而不屬於該接口。
4)、接口中的方法可以被聲明為public或不聲明,但結果都會按照public類型處理。
5)、當實現一個接口時,需要將被定義的方法聲明為public類型的,否則為默認訪問類型,Java編譯器不允許這種情況。
6)、如果沒有實現接口中所有方法,那麽創建的仍然是一個接口。子類必須實現接口中未實現的方法,除非子類也是接口。
7)、擴展一個接口來生成新的接口應使用關鍵字extends,實現一個接口使用implements。
8)、接口中的方法是抽象方法(abstract),不能是靜態方法(static))、接口的所有方法都是抽象的,而抽象方法是沒有static,有static的方法是不能override的,所以這樣定義接口才有意義。
接口中的字段是默認為:static final ,通俗說就是常量。
1.6類如何實現接口:
//示例: public class Mobile implements IWifi{ public void send1(){ System.out.println("用wifi發送信息"); } public void receive1(){ System.out.println("用wifi接收信息"); } public void send(){ System.out.println("用手機發短"); } }
註意:
1.類如果沒有實現全部的抽象方法,這個類必須定義為抽象類implements關鍵字
2.接口可以被子接口繼承,使用extends關鍵字
3.子類可以繼承一個父類,實現多個接口
4.接口不能實例化對象,但接口類型變量可以引用實現的子類對象
//示例: public interface IUSB2{ public abstract void send2(); public void receive2(); } public interface IUSB3 extends IUSB2{ public abstract void connection(IUSB3 usb); }
//示例:繼承一個父類,實現多個接口 public class Computer{ public void downLoad(){} public void upLoad(){} ... } public class Dell_Computer extends Computer implements IWifi,IUSB3{ public void connection(IUSB3 ortherUsb){ System.out.println("this<-->ortherUsb"); System.out.println("連接USB3.0設置"); } public void send1(){ System.out.println("用wifi發送信息"); } public void receive1(){ System.out.println("用wifi接收信息"); } public void send2(){ System.out.println("用USB3.0發送信息"); } public void receive2(){ System.out.println("用USB3.0接收信息"); } }
接口不能實例化對象,但接口類型變量可以引用實現的子類對象
IWifi wifi設備1 = new Mobile();
Mobile 手機= new Mobile();
wifi設備1 可以訪問的方法:send1()和receive1();
手機 可以訪問的方法:send1(),receive1(),send();
IWifi wifi設備2 = new Dell_Computer();
IUSB2 設備3 = new Dell_Computer();
IUSB3 設備4 = new Dell_Computer();
Computer 電腦 = new Dell_Computer();
Dell_Computer 筆記本 = new Dell_Computer();
wifi設備2 可以訪問的方法:send1()和receive1();
設備3 可以訪問的方法:send2()和receive2();
設備4 可以訪問的方法:send2(),receive2()和connection(參數);
電腦 可以訪問的方法:downLoad()和upLoad();
筆記本 可以訪問的方法:send1(),receive1(),send2(),receive2(),connection(參數),downLoad()和upLoad();
二、抽象類
2.1、語法定義
抽象類定義,抽象類前使用abstract關鍵字修飾,則該類為抽象類。
2.2、用途
a、在某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但無法準確知道這些子類如何實現這些方法
(抽象類約束子類必須有哪些方法,但並不關註子類怎麽去實現這些方法。)
b、從多個具有相同特征的類中抽象出一個抽象類,以這個抽象類作為子類的模板,從而避免了子類設計的隨意性。
2.3、意義
限制規定子類必須實現某些方法,但不關註實現細節。
2.4、特點
1,抽象方法一定在抽象類中
2,抽象方法和抽象類都必須被abstract關鍵字修飾
3,抽象類不可以用new創建對象。因為調用抽象方法沒意義4,抽象類中的抽象方法要被使用,必須由子類復寫起所有的抽象方法後,建立子類對象調用。
如果子類只覆蓋了部分抽象方法,那麽該子類還是一個抽象類。
5、抽象方法沒有方法體,以分號結束
//示例 package com.zhangguo.chapter5.s2; import java.util.Scanner; /** 動物 */ public abstract class Animal { /** 名稱 */ public String name; /** 抽象方法,無方法體,必須被子類實現(重寫) */ public abstract void eat(); /**測試*/ public static void main(String[] args) { //LSP 裏氏替換原則 Animal dog=new Dog(); dog.name="博美"; //int i=1; //Scanner input=new Scanner(System.in); dog.eat(); } /**抽象類中可以有非抽象方法,可以有靜態方法*/ public void show(){}; } /**抽象類動物(Animal)的子類,必須實現父類未實現的方法*/ class Dog extends Animal { //註解 @Override public void eat() { System.out.println(this.name+"狗在吃骨頭"); } }
運行結果:
2.5抽象類和接口的區別:
共同點與區別:
1.繼承的層次結構都是上層。
2.都不能實例化對象。
3.接口所有方法都是抽象,變量都是public static final類型,抽象類可以有抽象方法和常量。
4.抽象類只能作為唯一的父類,接口可以實現多個也可以被繼承。
5.抽象類由abstract class定義,接口由interface定義。
6.父類與子類是"is a"的關系,父類是抽象類,父類與子類是"like a"的關系,父類是接口。
三、Final(最終的)
3.1、final修飾類
final修飾的類不允許被繼承。
一個類不能既是final的,又是abstract的。因為abstract的主要目的是定義一種約定,讓子類去實現這種約定,而final表示該類不能被繼承,兩者矛盾。
3.2、final修飾方法
final修飾方法,表示該方法不能被子類中的方法覆寫Override。不能被重寫
3.3、final修飾變量
final成員變量表示常量,只能被賦值一次,賦值後值不再改變。
當final修飾一個原生數據類型時,表示該原生數據類型的值不能發生變化;
如果final修飾一個引用類型時,表示該引用類型不能再指向其他對象了,但該引用所指向的對象的內容是可以發生變化的。
本質上是一回事,因為引用的值是一個地址,final要求值,即地址的值不發生變化。
final修飾一個成員變量(屬性),必須要顯示初始化。
這裏有兩種初始化方式,一種是在變量聲明的時候初始化;第二種方法是在聲明變量的時候不賦初值,但是要在這個變量所在的類的所有的構造函數中對這個變量賦初值。
當函數的參數類型聲明為final時,說明該參數是只讀型的。
JAVA學習總結(四)