天天看點

java中用關鍵字什麼指明抽象_JavaSE核心技術-面向對象進階特性

面向對象主要特征

繼承(inheritance)

繼承也稱泛化,繼承性是子類自動共享父類屬性和方法的機制。

是類之間的的一種關系,一般類與特殊類之間的關系。關鍵字extends

*被繼承的類稱為父類(超類,基類),繼承的類叫子類(派生類)。

*子類繼承父類的所有屬性和方法,同時也可以增加自己的屬性和方法。

文法為:【修飾符】class 子類名 extends 父類名

例:

java中用關鍵字什麼指明抽象_JavaSE核心技術-面向對象進階特性

圖檔.png

繼承的含義

*java中隻支援單繼承,就是每個類隻能有一個父類,不允許有多重繼承。

*一個父類可以有多個子類

*子類繼承父類的所有屬性和方法。

*子類是父類的一種,也可以說“子類就是父類”。

類的繼承

子類執行個體化的過程

*子類執行個體化時先執行個體化其父類,然後執行個體化子類。

*要先調用父類的構造器,父類構造器運作完畢,才調用子類的構造器。

調用構造方法

在構造方法中,可以使用this或super調用其他的構造方法

*super()

作用:調用父類構造器

隻能出現在子類的構造器中,且必須是第一行。

super()中的參數,決定了調用父類的哪個構造器。

如果子類構造器中沒有出現super,那麼編譯器會預設加上super(),即調用父類的空構造器,如果父類沒有空構造器,編譯器提示錯誤。

(父類出現多個構造器,即重載使用super)

*this()

作用:調用本類的構造器。

隻能寫在構造器的第一行。

在同一個構造器中super()和this()不能同時出現。

-子類執行個體化過程

*使用預設構造器

*在子類中建立構造器

*在子類中建立構造器時,必須調用父類構造器

1.子類可以在自己的構造器中使用super關鍵字來調用父類構造器

例:super(參數1,參數2,)

2.如調用的是父類無參的構造器,那不可用super()

3.如果子類中調用了父類無參的構造器,而父類中沒有無參構造器則系統出錯。

super和this關鍵字

super.

指向父類的引用。

通過關鍵字super我們可以指定子類在構造時調用父類的哪個構造器

,達到先執行個體化父類然後執行個體化子類的目的。

子類的構造器預設的調用父類無參構造器,即子類構造器中沒有用

super指明調用父類哪個構造器的話,實際上編譯器會自動的在子類

構造器第一行加入代碼super( );

this.

指向本類的引用。

我們知道子類在執行個體化時必須調用父類的構造器,實際上有的子類

構造器也可以先調用本類的其他構造器,然後再通過那個構造器調

用父類的構造器

無論是調用父類的構造器還是子類的構造器,最終都是找到最頂級

的父類自上而下的執行個體化。隻要中間環節有一個構造器沒找到,這

個子類就無法完成執行個體化。

封裝(encapsulation)

所謂封裝是把對象的屬性和行為結合在一個獨立的系統機關内部。

盡可能隐蔽對象的内部細節,隻向外部提供接口。

封裝的重要意義:

使對象能夠集中而完整地描述并對應一個具體事物

展現了事物的相對獨立性,使對象外部不能随意存取對象的内部資料

權限修飾符

使用通路修飾符對類的成員進行控制,在java中稱為“封裝”。

用來控制類的成員和類的使用範圍。

權限修飾符包括:

java中用關鍵字什麼指明抽象_JavaSE核心技術-面向對象進階特性

圖檔.png

封裝的常用設定:

*構造器和類的權限通常為public

*private權限最小,限制類外通路,一般把屬性設為private,讓其他類不能直接通路屬性,達到保護屬性的目的。

*不使用權限符時即default的成員在類内以及在同一個包内的其他類可以通路。

*protected所修飾的成員在類内,同一個包中,所在類的子類中都可以通路。

方法的覆寫(override)

也可稱為重寫(rewrite),是對父類中繼承來的方法進行改造,隻有在子類繼承父類時發生。

方法覆寫規則

在子類中的覆寫方法與父類中被覆寫的方法應具有

相同的方法名

相同的參數清單(參數數量、參數類型、參數順序都要相同)

相同的傳回值類型

子類覆寫方法的通路權限要不小于父類中被覆寫方法的通路權限

abstract和final

在Java中使用abstract關鍵字定義抽象方法

例:abstract int method1(int a, int b);

abtract class A {

String name;

abstract int method1(int a, int b);

void sayHi( ){

System.out.println(“Hello!”);

};

抽象方法

隻有方法聲明,沒有方法實作的方法

抽象方法需要子類重寫該方法,是以不能用private、final修飾

抽象類是抽象方法和非抽象方法的集合,包含特殊情況如下:

*抽象類中可以全部是抽象對象

*抽象類中可以全部為非抽象方法

抽象類

抽象類規則

注意:

*抽象類不能被執行個體化

*包含的抽象方法必須在其子類中被實作,否則子類隻能聲明為abstract;

*抽象方法不能為static;

final關鍵字

final可以修飾的元素:

類:不能被繼承

變量(屬性和局部變量):不能被重新指派

– 在聲明時指派,或在構造器中指派

– 系統不會對final屬性預設的賦初始值

方法:不能在子類中被覆寫,即不能修改。

接口(interface)

接口意義

java繼承時一個類隻有一個直接父類,也就是單繼承,但是一個類可以實作多個接口,接口彌補了類的不能多繼承缺點,繼承和接口的雙重設計即保持了類的資料安全也變相實作了多繼承。

接口的概念

*接口中隻包含常量和抽象方法,而沒有變量和方法的實作。

*接口對類來說是一套規範,是一套行為協定。

接口不是一個類,不能執行個體化。

文法格式:

接口的成員:常量(字段),抽象方法

java中用關鍵字什麼指明抽象_JavaSE核心技術-面向對象進階特性

圖檔.png注意:接口不是一個類,沒有構造器,不能被執行個體化。

*接口用interface關鍵字來定義,而不是class。

接口預設:

-常量:public static final

-抽象方法:public abstract

接口與接口的繼承

可實作多繼承

java中用關鍵字什麼指明抽象_JavaSE核心技術-面向對象進階特性

圖檔.png

java中用關鍵字什麼指明抽象_JavaSE核心技術-面向對象進階特性

圖檔.png

接口和類的關系

類實作接口-implements

為了使用一個接口,你要編寫實作接口的類

如果一個類要實作一個接口,那麼這個類就必須實作接口中所有抽象方法。

否則這個類隻能聲明為抽象類

多個無關的類可以實作一個接口,一個類可以實作多個無關的接口

一個類可以在繼承一個父類的同時,實作一個或多個接口

java中用關鍵字什麼指明抽象_JavaSE核心技術-面向對象進階特性

圖檔.png

接口可以實作多繼承:用接口可以實作混合類型(主類型,副類型)在java中可以通過接口分出主次類型;主類型使用繼承,副類型使用接口實作。

JDK8接口預設方法

在JDK8之前,接口不能定義任何實作,這意味着之前所有的JAVA版本中

,接口制定的方法是抽象的,不包含方法體。

從JKD8開始,添加了一種新功能-預設方法。預設方法允許接口方法定義

預設實作,而所有子類都将擁有該方法及實作。

java中用關鍵字什麼指明抽象_JavaSE核心技術-面向對象進階特性

圖檔.png

預設方法是可選的,子類可以根據不同的需求Override預設實作。

接口與抽象類的對比

接口不能含有任何非抽象方法,而抽象類可以。

從JKD8開始,接口可以有預設方法。

類可以實作多個接口,但隻能有一個父類。

接口和接口之間可以多繼承

如:public interface A extends B,C

其中B,C也是接口.

抽象類可以了解為抽象方法和非抽象方法的混合體,而接口中的方法

完全是抽象方法,是一套純粹的規範。一般來說,有關系的類才能繼

承同一個抽象類,而無關的類不可能有同一個抽象父類,但是無關的

類可以實作同一個接口。

final常用方式

把常量設定為靜态static,多個執行個體共享該常量,沒有必要每個對象保

存一份;

常量設定為final類型,指派以後不能再改變;

最後注意遵守常量命名規範,所有字母大寫、單詞之間用下劃線。

java中用關鍵字什麼指明抽象_JavaSE核心技術-面向對象進階特性

圖檔.png

引用資料類型的轉換

上溯造型

向上轉型(uppcasting)-子類轉換為父類,自動轉換。

前提-具有實作和繼承關系

向上轉換損失了子類的新擴充的屬性和方法,僅可以使用從父類中繼承的屬性和方法。

java中用關鍵字什麼指明抽象_JavaSE核心技術-面向對象進階特性

圖檔.png

下溯造型

向下轉型(Downcasting):強制轉換

将父類對象顯示的轉換成子類類型。

曾經向上轉換過的對象,才能再向下轉換。對象不允許不經過上溯造型而直

接下溯造型。

如下寫法是會出現運作期錯誤:

– Person p = new Person();

– Student s = (Student)p;

instanceof運算符

通過instanceof來判斷該經過上溯轉型後是哪一個子類的。

判斷一個執行個體對象是否屬于一個類

– object instanceof class 對象 instanceof 類

判斷一個類是否實作了某個接口

– object instanceof interface 對象 instanceof 接口

傳回值都是boolean類型

例如:

Animal a = new Cat( );

boolean b= a instanceof Cat;

class Animal{}

class Cat extends Animal{}

多态(polymorphism)

指同一個命名可具有不同的語義。對于子類可用不同的方法替代實作父類的服務的方法(用父類建立子類的對象)

多态存在的三個必要條件:

*要有繼承,或實作。

*要有重寫。

*父類引用指向子類對象。

一旦滿足以上3個條件,當調用父類中被重寫的方法後,運作時建立的是

哪個子類的對象,就調用該子類中重寫的那個方法。

在執行期間(而非編譯期間)判斷所引用對象的實際類型,根據其實際

類型調用相應的方法。

内部類

内部類就是定義在另一個類内部的類。

内部類對于同一包中的其他類來說,内部類能夠隐藏起來。

文法:

java中用關鍵字什麼指明抽象_JavaSE核心技術-面向對象進階特性

圖檔.png

**注意:

内部類可以通路其外部類中所有的屬性和方法,無需建立外部類的對象。

必須建立内部類的對象,否則無法從外部類通路内部類的變量和方法。

如果内部類中有和外部類同名的變量或方法,則内部類的變量和方法将獲

得比外部類的變量和方法更高的優先級。

不能定義static變量

一個類隻會被這個類所調用,其他類不會使用他,你可以把它定義成

一内部類,這樣可以隐藏實作細節,避免錯誤的調用。

java中用關鍵字什麼指明抽象_JavaSE核心技術-面向對象進階特性

圖檔.png