1. 程式人生 > >JAVA-面向對象

JAVA-面向對象

測試工程師 程序員 編程語言 c語言 可行性


軟件公司做項目的流程:

1 可行性分析

2 需求分析,客戶要什麽?需要和客戶多次溝通,通過需求分析文檔的確認來確定。

3 商業建模,大型項目需要。

4 項目分析和設計。有些公司設計分概要設計和詳細設計。

5 編碼(程序員的主業)

6 測試(測試工程師)

7 部署

8 維護


面向對象(OO)的編程

面向對象的編程思想的核心就是 一切皆是對象。

面向對象和面向過程是目前常見的編程思想,面向過程就是編程時以數據的流程(過程)作為核心的編程。C語言是面對過程的代表,其它的主流都是面向對象的編程語言。

面向對象以現實為編程思想,現實是什麽樣子,代碼就怎麽實現。

OOA - 面向對象的分析

OOD - 面向對象的設計

OOP - 面向對象的編程

OOT - 面向對象的測試



面向對象的核心概念

類/對象/屬性(成員變量)/方法(成員方法)/構造方法

重載(當一個類中寫上兩個或多個構造,自然形成構造方法的重載。重載就是類名同名但參數列表不同)

重寫(當子類從父類中繼承下來的方法不足以滿足子類的要求,就需要對父類中的方法進行重寫/覆蓋,以滿足子類需求)

封裝/繼承/多態


Java的一些關鍵字:

this和super、static、final、abstract等


面向對象的三大基本特性: 封裝、繼承、多態。

四大對象的基本特征:封裝、繼承、多態、抽象。


Java編程以類class作為基本單位,寫代碼先寫class。


是客觀世界中同一類事物的統稱,是對同一類事物的抽象,是概念,客觀世界中其實是不存在類的。

對象就是客觀世界中的每一個具體事物。

引用就是對象的標號,客觀世界中一般就是名字,代碼中就是變量名。


寫程序要寫類,調用代碼時用對象。


Scanner sc = new Scanner(System.in); //創建對象

Scanner是類, sc是引用, new Scanner() 是對象。


屬性/方法和構造方法

同一類事物的特征/狀態 叫屬性(Field)/字段,也叫成員變量。

同一類事物的行為/功能 叫方法,也叫成員方法。

構造方法就是創建對象時調用的,用於創建某類事物的對象。


一個類的代碼由 屬性/方法和構造方法 組成,但屬性和方法可有可無


類的語法:

修飾符 class 類名{

//屬性/方法和構造

}

修飾符可以不寫


屬性(成員變量)的語法:(屬性是直接定義在類體中的變量)

修飾符 變量類型(基本型和引用型) 變量名 = 初始值;

修飾符可以不寫, = 初始值也可以不寫。

如果屬性不給初始值,有默認值(變量不一定)。默認值和數組元素的一樣。

整型都是0,浮點都是0.0,布爾都是false,字符型默認為空格,引用類型都是null。

默認值沒有實際的意義。


方法(成員方法)的語法

修飾符 返回值類型 方法名(參數列表) throws Exception(拋異常) { }

修飾符可以不寫,返回值類型如果沒有返回值,寫void。

throws Exception 可以不寫。參數列表如果沒有參數,寫() 。


屬性和方法的區分:有()的是方法,沒有()是屬性。


練習:

寫一個類Point(點),裏面有兩個int類型的屬性x和y。(能javac不能java)

publilc class Point{

int x;

int y;

}



創建對象的方法:

new 構造方法(參數列表); (new加構造方法(修飾符 類名(參數列表))組成對象)

參數列表可以沒有,但是()必須有。

new 後面只能跟構造方法,對象/引用後面可以用.調用屬性和方法。


內存的區域劃分:

內存分為:代碼區(方法區)、字符串常量區、棧區/堆棧區stack、堆區heap等。


代碼區存放代碼,主要是方法和構造方法。


字符串常量區主要放各種字符串常量,就是""格式的字符串。


棧區存放各種局部變量,包括方法的參數。特點的是後進先出。


堆區是一大片內存,new的東西全部在堆區。


C/C++程序員用指針操作內存,Java程序沒有指針,Java程序員不需要管內存的事情。

JVM處理內存。 new 可以分配堆內存(創建對象就是在堆中開辟內存空間),內存回收由JVM啟動gc回收垃圾。



Point p = new Point();不是一個語句,由3個語句組成:

1 Point p 會在棧內存中放一個變量p進去。

2 new Point() 會在堆內存中創建一個新的Point對象,裏面有x和y,值為0。

3 = 就是賦值,把對象的首地址賦值給p。


練習:

寫一個TestPoint類,寫主方法,然後創建一下Point對象,再把坐標設置1,2。

然後打印一下點的坐標。



方法有三要素: 返回值類型、方法名、參數列表。


方法名就是方法的名稱,符合標識符的規則即可。

參數列表就是傳入方法的數據,比如:算兩個整數的加法,需要參數--2個加數。

返回值類型就是方法傳出的數據(數據的類型),比如:算兩個整數的加法,需要返回結果。

方法中如果需要返回,使用return關鍵字。


public int add(int a,int b){

return a+b;

}


練習:

在Point中加上兩個方法,上下移動和左右移動。

up() - y發生改變

left() - x發生改變

並且在TestPoint中調用,向上移動2個坐標,並且先向右移動3個坐標。並且打印新的坐標。


構造方法 - 用於創建對象的代碼,一般都寫初始化的代碼。


因為寫的是類,調用的時候要用對象,如何由類得到對象呢? new + 構造方法。


類都需要實例化成對象,因此,每個類都是必須有構造方法。


JVM針對構造方法的機制: 如果類中沒有定義構造方法,系統會自動加一個無參數的構造方法;如果寫了構造方法,系統不再添加,因為已經有了。


構造方法的語法:

修飾符 類名(參數列表) throws Exception{


}

修飾符和throws可以不寫。

public Point(){ }


構造方法和方法的兩大區別:

1 方法有返回值,構造方法沒有返回值,包括void也沒有。

2 方法名可以自定義,構造名和類名必須一致。

在同一個類中,構造方法可以寫多個,但要求參數列表必須不同。(重載)


面向對象的代碼匯總:

public class Point{ //類

屬性: int age;

構造方法: public Point(){ }

方法: public String test(int a)

{ return "hello"; }

}


public class TestPoint{

main(){

Point p = new Point(); //構造方法的調用(創建對象)

p.age = 30; //屬性

String s = p.test(3);//方法

}

}

作業:

1 寫一個Student類,屬性:姓名/學號/年齡;構造寫兩個;方法寫三個: 獲取學生姓名的,修改學生姓名的,顯示學生信息(包括姓名/學號和年齡)。然後寫一個TestStudent類測試。

2 寫一個商品Product類,屬性:編號、名稱和價格;構造寫兩個;方法寫三個:修改價格,顯示商品信息,比較兩個商品價格的高低(高/低/相等)。然後寫一個TestProduct類測試。





寫一個類(名詞性質),類中包括:

public class 類名{

屬性;

構造方法;

方法;

}

調用類中, new 構造方法() 可以得到對象,用對象/引用. 調用裏面的屬性和方法。 new一下,點一下。

Product類的方法:

public void setPrice(double nPrice){

if(nPrice<0){

System.out.println("價格錯誤,修改失敗");

}else{

price = nPrice;

}

}


/*

比較價格

*/

public int comPrice(Product p){

if(price>p.price){

return 1;

}else if(price==p.price){

return 0;

}else{

return -1;

}

}


this關鍵字


所有的屬性變量不能重名,在同一區域的局部變量不能重名,但屬性和局部變量可以重名。

在局部變量的作用區域之外,變量名代表屬性,

在局部變量的作用區域之內,代表局部變量,如果想使用屬性,需要this. 調用。


在構造方法中,可以用this()調用本類的其它構造。this()必須放在構造的第一行。


this.可以調用本類的屬性和方法;this()可以調用本類的構造。


this()可以實現構造代碼的復用。

代碼復用是軟件開發中最常見的一種方式,就是代碼只寫一次,其它地方都是調用。

其實,我們所有的API都是代碼復用。


重載 - Overload

當在一個類中,寫上兩個或者更多的構造時,自然形成了構造方法的重載。重載就是同名但參數不同。

重載的特點:

相同的方法名稱,不同的參數列表,返回類型最好相同。

重載的好處:

就是讓調用者更方便,只需要記住一個方法名就可以了。重載不會簡化代碼量。

不是所有的方法都需要重載,只有執行相似功能的方法才可以重載。



Java參數傳遞


java中的方法可以傳遞參數,參數的傳遞方法就是值傳遞


參數有形參和實參,定義方法時寫的參數叫形參真正調用方法時,傳遞的參數叫實參


調用方法時,會把實參傳遞給形參,方法內部其實是在使用形參。



參數傳遞的步驟:

1 分配實參的空間,基本類型在棧中賦值,引用類型變量在棧中,指向堆中的對象。

2 傳遞參數其實就是在棧中分配形參的空間,然後把棧中實參的值復制過來。

3 在方法中使用形參,方法結束形參出棧(消失),只剩下實參。


方法的遞歸

方法自己調用自己就叫遞歸。

遞歸有可能會大幅簡化代碼的編寫。

遞歸要考慮性能問題,有些時候可以使用循環而不是遞歸。

遞歸的使用原則:

1 必須有退出條件。

2 必須使問題變簡單,而不是復雜化。


遞歸實例:

public class TestN{

public long f(long n){ //遞歸

if(n == 1) return 1;

return n*f(n-1);

}

public static void main(String[] args){

TestN tn = new TestN();

long res = tn.f(20);

System.out.println(res);

}

}


int a =2 ;int b = 3; //不借助其它變量交換a和b

a = a+b;// a=5 b=3

b = a-b;// a=5 b=2

a = a-b;// a=3 b=2




封裝 - 代碼如果不做限制,很多屬性值是無效的。封裝就是為了保證屬性值有效的技術。


封裝的步驟:

1 先private(私有)修飾屬性(常量不用私有),讓屬性在類外不能被調用,避免類外的賦值。

另外要給屬性一個合理的初始值。

2 寫public的方法對屬性進行操作,一般都是set方法(寫入)和get()方法(讀取)。

3 構造裏面不要賦值,要調set方法賦值。


雖然封裝已經很嚴格,但是反射可以打破封裝。



----------------------------------------------------------------------------------------------------------------------------------------

今天內容:

(1)static關鍵字

(2)繼承

(3)訪問控制

(4)final關鍵字


1.static關鍵字(重點)

1.1 基本概念

通常情況下,屬性和方法都屬於對象層級,訪問屬性和方法時需要先創建對象再訪問,

每個對象都擁有自己獨立的屬性信息,

但當使用static關鍵字修飾屬性後,該屬性就不再隸屬於對象層級,而是提升類層級,被整個類創建的所有對象共享。


對於static(靜態的)修飾的屬性和方法來說,

雖然可以使用對象./類名.進行訪問,但是絕大多數情況下都建議使用類名.訪問。

static關鍵字可以修飾屬性/方法/語句塊。


1.2 使用方式

對屬性而言:

(1)對於非靜態屬性(無static)來說,每個對象都獨立擁有一份,只能通過各個對象通過對象.訪問,不能使用類名.訪問

(2)對於靜態屬性來說,該類型的所有對象共享同一份,可以通過對象./類名.訪問(兩種皆可,一般用類的多)。

對方法而言:

(3)非靜態方法中可以訪問靜態屬性,也可以訪問非靜態屬性。

(4)靜態方法中只能訪問靜態屬性,不能訪問非靜態屬性


如:

/*

詳細解釋this.的作用效果

*/

class A{ //類A

public void show(){ // => public void show(A this) 成員方法

}


public static void main(String[] args){ //主方法

A a = new A(); // => 創建對象,調用構造方法

a.show(); // => show(a); 對象調用方法 從系統底層來說是將對象當作實參調入方法之中,對應於方法定義來說是將對象調入方法定義中作為形參。

}

}


1.3 類加載的方式(了解)


類中使用static修飾的屬性/方法/語句塊都是隨著類的加載而準備就緒,其中類加載的主要方式有:

(1)當創建對象時會加載類信息。

(2)當使用類名.訪問static修飾的屬性/方法/語句塊時會加載類信息。

(3)使用Class.forName()可以加載類信息(以後講到)


註意:

只有當該屬性/方法/語句塊隸屬於類層級被多個對象所共享時才能加static,否則不要隨便加static關鍵字。


1.4 構造塊和靜態語句塊(了解)

完成構造方法之前的操作,例如調用數據庫、接入網絡什麽的。

在類體中使用{}括起來的語句塊,叫做構造塊,每次創建對象時都會執行一次構造塊。

在類體中使用static{}括起來的語句塊,叫做靜態語句塊,只在類加載時執行一次。


1.5 單例設計模式

(1)基本概念

在某些特殊場合中,某個類有且只能有一個對象,這樣的類叫做單例類。

使用單例類編程的模式就叫做單例設計模式


(2)實現方法

a.私有化構造方法。

b.創建並提供一個本類類型的對象,使用private和static修飾。

c.提供一個公有的,使用static修飾的get方法負責返回本類對象。


public class Singleton{


//private static Singleton s = new Singleton();//餓漢型 創建並提供一個本類類型的對象,

用private static 來修飾

private static Singleton s; //懶漢型


private Singleton(){ //私有化構造


}

public static Singleton getInstance(){ //提供一個公有化的 用static修飾的get方法來 返回本類類型。

//return s ;

if(null == s){

s = new Singleton;

}

else{

retutrn s;

}

}

}




今天內容:

(1)繼承

(2)訪問控制

(3)final關鍵字

(4)對象創建的過程

(5)多態


1.繼承

1.1 繼承的由來

學生類

屬性:學號、姓名、年齡

行為:學習、吃飯、娛樂

教師類

屬性:工號、姓名、年齡

行為:講課、吃飯、娛樂


由上面的類可知,有些屬性和行為是完全相同的,此時就可以將相同的屬性和行為提取出來封裝到另外一個類中,叫做Person類,讓學生類和教師類繼承Person類即可。


Person類

屬性:姓名、年齡

行為:吃飯、娛樂

學生類 繼承 Person類

屬性:學號

行為:學習

教師類 繼承 Person類

屬性:工號

行為:講課


1.2 基本概念


繼承就是指從現有類中派生出新類,新類可以吸收現有類中的屬性和行為,還可以增加自己獨有的屬性和行為,從而實現代碼的復用。

在java語言中使用 extends 來表達繼承關系。

如:

class Student extends Person{}

其中Student類 叫做 子類/派生類

其中Person類 叫做 父類/基類/超類


1.3 註意事項

(1)子類可以繼承父類的主要內容有:

a.可以繼承父類中的屬性,包括私有屬性。

b.可以繼承父類中的方法,不包括 私有方法 和 構造方法

(2)當創建子類對象時,會自動調用父類中的無參構造方法,如果希望調用父類中的有參構造方法,則需要使用super關鍵字。

無論子類中是否自定義構造方法,都會自動調用父類中的無參構造方法,用於初始化子類對象中的父類子對象。

(3)java語言中不支持多繼承,也就是說一個子類只能有一個父類,但一個父類可以有多個子類

(4)並不是兩個類中有相同的屬性和方法時,就一定可以繼承,必須滿足條件:子類 is a 父類時,才能使用繼承關系


1.4 super關鍵字的使用

(1)基本概念

this關鍵字表示本類對象,可以使用this.來訪問本類和父類的屬性和方法。

super關鍵字表示父類對象,可以使用super.來訪問父類中的屬性和方法。

(2)使用方式

在構造方法中使用this()表示 調用本類的 構造方法,要求必須在構造方法的第一行出現

在構造方法中使用super()表示 調用父類的 構造方法,要求必須在構造方法中第一行出現

this()和super()不可能同時出現,如果構造方法中啥也沒寫,則自動添加super()。


1.5 方法的重寫/覆蓋(override)


(1)方法重寫的由來

當子類從父類中繼承下來的方法不足以滿足子類的需求時,就需要對父類中的方法進行重寫/覆蓋,來滿足子類的需求。


(2)方法重寫的要求

a.要求方法名、參數列表以及返回值類型都相同。

b.要求子類重寫方法的訪問權限不能比父類的方法小。

c.要求子類重寫的方法不能拋出更大的異常。

d.static修飾的方法重寫以後還是static的。


1.6 繼承的作用

(1)實現了代碼的復用,並且提高了程序的擴展性和可維護性。

(2)繼承是多態的前提條件。


2.訪問控制

2.1 常用的訪問控制符

public - 表示公有的

默認方式 - 表示默認的訪問權限

protected - 表示保護的

private - 表示私有的


2.2 訪問控制符對應的訪問權限

訪問控制符 本類內部 子類 同一個包中的其他類 其他包中的類

--------------------------------------------------------------------------

public ok ok ok ok

默認方式 ok no ok no

protected ok ok ok no

private ok no no no


總結:

對於public修飾的屬性/方法來說,無論在哪裏都能訪問。

對於private修飾的屬性/方法來說,只能在本類內部訪問,其他都不能訪問。

一般來說,屬性都使用private修飾,而方法都使用public修飾。


2.3 包

包本質就是文件夾/目錄,用於存放不同的java文件,可以避免文件同名而引發的錯誤,也可以對文件進行歸類,便於管理。

定義包的語法格式是:

package 包名;

package 包名1.包名2.包名3....; 用於實現目錄的嵌套。


3.final關鍵字

3.1 基本概念

final 翻譯為 最終的,表示不可更改的意思。

final關鍵字 可以修飾 類/方法/屬性。


3.2 使用方式


final關鍵字修飾類 表示該類不能被繼承(斷子絕孫類),如:String類和System類、Math類,該方式的作用在於避免濫用繼承。


final關鍵字修飾方法 表示該方法不能被重寫,該方式的作用在於避免濫用重寫。

該方法可以被繼承。


final關鍵字修飾屬性 表示該屬性必須要被初始化,不能依賴默認方式初始化,而一旦初始化完畢之後則不能更改,

該方式的作用在於避免屬性值的意外修改。


3.3 final修飾屬性可以初始化的位置有:

(1)在定義屬性的同時指定初始值。

(2)在構造方法中指定初始值,但要求所有自定義構造方法中都要進行初始化。

(3)在構造塊中進行初始化。


4.對象創建的過程

4.1 單個類創建對象的執行過程

(1)將硬盤上的.class文件加載到內存中,該過程叫做類加載。

(2)在類加載的過程中自動加載靜態成員,包括靜態屬性和靜態方法以及靜態語句塊。

(3)在加載的過程中先執行靜態語句塊。

(4)執行完畢靜態語句塊之後執行構造塊(先父類後子類)。

(5)再執行構造方法,也就是執行構造方法體中的語句(先父類後子類) 。


4.2 單個類創建對象時屬性的賦值次序

(1)執行靜態語句塊中屬性的賦值。

(2)執行屬性的定義以及初始化語句。

(3)執行構造塊中的語句。

(4)執行構造方法體中的語句。

(5)執行main方法創建對象後的語句。


作業:

設計一個Girl類,屬性有:姓名、年齡以及是否有男朋友,行為有:顯示所有屬性信息。

設計一個Teacher類,屬性有:姓名、年齡以及薪水,行為有:顯示所有屬性信息。

先分別實現上述兩個類,再將共性提取出來為一個Person類,修改上述兩個類繼承自Person類,在Gir類和Teacher類中實現對顯示屬性信息方法的重寫。





今天內容:

(1)對象創建的過程

(2)多態

(3)抽象類

(4)接口


1.對象創建的過程

1.1 單個類對象創建的過程

(1)將硬盤上的.class文件加載到內存中,這個過程就叫類的加載。

(2)執行靜態語句塊,隨著類的加載而準備就緒。

(3)執行構造塊。

(4)執行構造方法體。


1.2 父子類對象創建的過程

(1)將硬盤上的.class文件加載到內存中,這個過程就叫類的加載。

(2)先加載父類,執行父類的靜態語句塊。

(3)再加載子類,執行子類的靜態語句塊。

(4)創建父類子對象,對父類子對象中的屬性進行初始化,執行父類的構造塊。

(5)執行父類的構造方法體,實現父類子對象的創建過程。

(6)創建子類對象,對子類對象中的屬性進行初始化,執行子類的構造塊。

(7)執行子類的構造方法體,實現子類對象的創建過程。


對象創建的過程(new XX()):

1 JVM去硬盤中找class文件,然後讀入內存。

2 進行類加載,先加載父類,後加載子類,同時執行分配static屬性的內存空間,執行static語句塊。

3 給父類和子類的非靜態屬性分配內存空間,清空屬性或清0。

4 執行父類屬性的初始化語句(如果聲明的同時進行了賦值),否則就還是空或0。

5 執行父類的語句塊。

6 執行父類的構造。

7 執行子類屬性的初始化語句(如果聲明的同時進行了賦值),否則就還是空或0。

8 執行子類的語句塊。

9 執行子類的構造。




2.多態(重中之重)

2.1 基本概念

多態就是指同一種事物具有多種不同的形態。

Java中有幾種多態:

1 基本類型的多態 -- 本質就是基本類型的自動類型轉換和自動裝箱/解箱。(不是通常指的多態)

2 方法多態 -- 方法的重寫和方法的重載

3 引用類型的多態 -- 本質就是引用類型的自動類型轉換(子類對象自動轉父類)

也就是父類的引用指向了子類的對象,用父類的類型可以傳入父類和子類的對象。父類引用可以表示父類對象和所有子類的對象。


通常指的多態就是引用類型的多態。多態最大的作用就是: 設計方法時,可以用父類的類型代表父類和子類的所有對象


如:

byte b = 4; short s = 4; int i = 4;

寵物:貓/狗/魚/烏龜/兔子/小強/... ...


2.2 語法格式

父類類型 引用名 = new 子類類型();


在編譯階段引用是父類類型的,但是程序運行起來之後卻是子類類型的,最終調用的方法也是子類中重寫的方法,從而實現多態。


2.3 多態的效果

(1)當使用父類引用指向子類對象時,父類引用只能調用父類中的方法,不能直接調用子類中的方法,因為在編譯階段就報錯。

(2)當希望父類引用能調用子類的方法時,需要對父類引用進行強制類型轉換,再調用。


2.4 父子類型之間的轉換

子類類型向父類類型轉換時,只需要自動類型轉換即可。

父類類型向子類類型轉換時,需要進行強制類型轉換。

引用類型的轉換必須發生在父子類之間,否則編譯階段報錯,而且父類引用必須轉換為真正指向的子類對象類型,否則在運行階段拋出異常,也就是產生錯誤。

當需要發生強制類型轉換時,應該先使用instanceof來判斷引用名指向的真正類型是否和要轉換的目標類型相同,如果是則返回true,此時放心強轉,否則不要進行強轉。

如:

if(ps instanceof Student){ 如果成立則返回true,否則返回false。

... ...

}


2.5 多態的作用

如:

public void show(){} - 打印學生的所有信息

public void show(){} - 打印老師的所有信息

public void show(){} - 打印工人的所有信息


public void show(Student s){}

public void show(Teacher t){}

public void show(Worker w){}


解析:

Person p = new Student();

Person p = new Teacher();

Person p = new Worker();


public void show(Person p){

p.print();

}


調用:

Student s = new Student();

show(s); => Person p = s; => p.print() => Student類print

Teacher t = new Teacher();

show(t); => Person p = t; => p.print() => Teacher類print

Worker w = new Worker();

show(w); => Person p = w; => p.print() => Worker類print


多態的主要作用在於屏蔽不同子類對象之間的差異性,從而寫出通用的代碼,實現通用的編程效果,也便於程序後續的維護和擴展性。


3.抽象類

3.1 基本概念

抽象類就是指使用abstract關鍵字修飾的類。

抽象類不能實例化對象/創建對象/構造對象,但可以被繼承。其意義就在於被繼承。


3.2 抽象方法

抽象方法就是指使用abstract關鍵字修飾的方法,並且該方法沒有方法體,用分號結尾。

語法格式:

訪問控制符 abstract 返回值類型 方法名稱(形參1,形參2,...);


3.3 抽象類和抽象方法之間的關系

(1)抽象類可以沒有抽象方法,也可以有抽象方法。

(2)擁有抽象方法的類必須被聲明為抽象類。

(3)抽象類中可以有普通/靜態的方法。


3.4 抽象類的作用

抽象類的主要作用在於被繼承,而子類一旦繼承抽象類之後就必須重寫抽象類中的抽象方法,否則子類也變成抽象類。


註意:

抽象類雖然不能創建對象,但是有構造方法,為了子類創建對象時調用。


abstract 不能和final、static同時出現。


4.接口

4.1 基本概念

黃金 屬於金屬,黃金屬於貨幣,在java語言中支持單繼承,因此黃金不能同時繼承金屬和貨幣,那麽怎麽辦呢?

在java中引出接口的概念,一個類可以同時實現多個接口。

定義類使用class關鍵字,繼承類使用extends關鍵字。

定義接口使用interface關鍵字,實現接口使用implements關鍵字。

Java的接口用於解決多重繼承問題。接口一般用於定義規範,交給子類實現。

4.2 註意事項

(1)接口中的屬性必須且只能是public static final,不寫自動添加。

(2)接口中的方法必須且只能是public abstract,不寫自動添加。


4.3 類、接口之間的繼承關系

類和類之間的繼承 單繼承 使用extends關鍵字

類和接口之間的繼承 多繼承 使用implements關鍵字

接口和接口之間的繼承 單繼承 使用extends關鍵字


註意:

對於默認訪問方式的屬性來說,在其他包的子類中是不能直接訪問的,但是在同一個包中的子類是可以訪問的。







復習:

1.對象和類的基本概念

對象就是個東西,萬物皆對象。

無論是何種對象,都會有 屬性和行為。


將對象的共性提取出來組成一個類,類中封裝描述屬性的成員變量,描述行為的成員方法。

類是一種用戶自定義的引用數據類型。


2.類的定義

訪問修飾符 class 類名{

訪問修飾符 數據類型 變量名 = 初始值;

訪問修飾符 返回值類型 方法名(形參列表){ 方法體; }

}

如:

public class Person{

private String name;

public void show(){}

}


3.創建對象

類類型 引用變量名 = new 類類型();


4.構造方法

class 類名{


訪問修飾符 類名(形參列表){ 構造方法體; }

}


如果一個類中沒有自定義構造方法,則系統會自動提供一個無參的默認構造方法。

如果一個類型中出現了構造方法,無論是否有參數,系統都不在提供默認構造方法。


5.方法的重載

在同一個類中,方法名相同,參數列表不同,返回值類型最好相同。

調用者使用非常方便。

System.out.println(char); ... ...


6.this關鍵字

Person p1 = new Person();

Person p2 = new Person();


p1.show(); => show(p1);

p2.show(); => show(p2);


當形參變量名和屬性完全相同時,需要使用this.來進行區分

this() - 表示調用本類的構造方法


7.封裝

(1)私有化屬性; (2)提供公有的get/set方法 (3)在構造方法中使用get/set方法


8.static關鍵字

static關鍵字可以修飾屬性/方法,從對象層級提升到類層級,雖然可以使用對象.調用,但是推薦使用類名.調用。

static修飾的方法中 能訪問static修飾的屬性和方法,但是不能訪問非static修飾的。

非static修飾的方法中 可以訪問static修飾的,也可以訪問非static修飾的


單例設計模式 - 懶漢式/餓漢式


9.繼承

繼承就是從現有類中派生出新的子類,子類吸收現有類的屬性和方法,還可以增加新的屬性和行為,表示個性.

使用extends關鍵字進行繼承,java中支持單繼承,不支持多繼承。

Student extends Person


super() - 調用父類的無參構造方法

super(實參) - 調用父類中的有參構造方法

必須放在構造方法中的第一行,不可能和this同時出現


this.調用本類的屬性/方法以及從父類中繼承來的屬性和方法

this()


super.調用父類的屬性/方法

super()


方法的重寫

要求方法名相同、返回值類型相同、參數列表也相同。

不能拋出更大的異常

權限不能更小


10.final關鍵字

final修飾類/方法/屬性。


final修飾的屬性可以初始化的位置:定義/構造方法中/構造塊


11.多態

父類類型 引用名 = new 子類類型();


子類類型轉換到父類類型自動轉換完成

父類類型到子類類型的轉換 需要 進行 強制類型轉換,進行判斷

父子類之間的轉換

instanceof 進行判斷 true false


多態屏蔽不同子類之間的差異性,實現了通用的編程


12.抽象類

使用abstract關鍵字修飾的類 不能創建對象,但是有構造方法

使用abstract關鍵字修飾方法,並且沒有方法體,使用分號結尾。


被繼承,要求子類去實現一些方法。


13.接口

用於解決多繼承的問題。

interface關鍵字 implements


類 繼承 類 單繼承 extends

類 繼承 接口 多繼承 implements

接口 繼承 接口 單繼承 extends


接口中沒有構造方法,接口中的所有屬性都是自帶 public static final

接口中的所有方法自帶 public abstract


抽象類和接口之間的區別:

a.關鍵字不同,class 和 interface

b.抽象類中有構造方法,接口中沒有構造方法

c.抽象類支持單繼承,接口支持多繼承

d.抽象類中的屬性可以是普通的,但接口中都是自帶public static final.

e.抽象類中可以有普通方法,但是接口中都是自帶public abstract.

f.抽象類中增加方法可以不對子類產生影響,但是接口中只要增加方法,就一定

會影響子類


接口和抽象類的區別:

1 關鍵字不同,接口是interface,抽象類是class。

2 繼承方式不同,接口是多繼承,使用implemnets關鍵字;抽象類是單繼承,使用extends關鍵字。

3 接口中所有的屬性都是public的常量,抽象類的屬性可以隨便。

4 接口中沒有構造方法的存在,抽象類一定有構造方法,但不能new,子類可以用super()調用。

5 接口中的方法都是public abstract的,抽象類中可以有抽象方法,也可以有非抽象方法。

6 接口有強制性,接口中的方法子類必須重寫,否則就是抽象類;抽象類未必。

7 定義規範,最好使用接口而不是抽象類。


--------------------------------------------------------------------------------


JAVA-面向對象