日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java中塑形_Java学习5——接口和多态

發(fā)布時間:2024/9/27 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中塑形_Java学习5——接口和多态 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 接口

接口相當(dāng)于一個完全抽象的,沒有任何實現(xiàn)的類

所有的成員函數(shù)都是抽象函數(shù)

所有的成員變量都是public static final而且一定要賦予初值

接口中的靜態(tài)函數(shù)必須有函數(shù)體

接口在聲明時也可以聲明是泛型接口,其格式是在接口名稱后加上

使用關(guān)鍵詞interface聲明接口

[接口修飾符] interface 接口名稱[] [extends 超類名]{

... //方法的原型或靜態(tài)變量

}

實現(xiàn)接口使用關(guān)鍵字implements

實現(xiàn)接口的語法如下:

public class 類名稱 implements 接口名稱{

//實現(xiàn)接口的方法

//本類的數(shù)據(jù)和方法

}

類可以實現(xiàn)很多接口

接口不能繼承類,但是接口可以繼承接口,派生出新的接口,而且一個接口可以繼承多個接口

接口不能實現(xiàn)接口

2 塑型/造型

Java的對象變量是多態(tài)的,它們能保存不止一種類型的對象

它們可以保存的是聲明類型的對象,或聲明類型的子類的對象

當(dāng)把子類的對象賦給父類的變量的時候,就發(fā)生了向上造型

2.1 類型轉(zhuǎn)換

類型轉(zhuǎn)換也稱為塑型(type-casting),對象只能被塑性為:

任何一個超類類型

對象所屬的類實現(xiàn)的一個接口

自己原來所屬的類

塑性主要應(yīng)用在如下場合:

賦值轉(zhuǎn)換

方法調(diào)用轉(zhuǎn)換

算數(shù)表達式轉(zhuǎn)換

字符串轉(zhuǎn)換

當(dāng)一個類對象被塑形為其超類后,它提供的方法就會減少

2.2 造型

用括號圍起類型放在值的前面

對象本身并沒有發(fā)生任何變化,所以不是“類型轉(zhuǎn)化”

運行時有機制來檢查這樣得轉(zhuǎn)化是否合理, ClassCastException

2.3 向上造型

把一個類型的對象賦給另外一個類型的變量

子類的對象可以賦值給父類的變量

注意:java中不存在對象對對象的賦值

父類的對象不能賦值給子類的對象

2.4 函數(shù)調(diào)用的綁定

當(dāng)通過對象調(diào)用函數(shù)的時候,調(diào)用哪個函數(shù)這件事情叫做綁定

靜態(tài)綁定:根據(jù)變量的聲明類型來決定

在成員函數(shù)中調(diào)用其他成員函數(shù)也是通過this這個對象來調(diào)用的

3 多態(tài)

3.1 多態(tài)的定義

多態(tài)指不同類型的對象可以響應(yīng)相同的消息

通過塑型可以將一個對象當(dāng)做它的基類對象看待,相同基類派生出的多種類型可被當(dāng)做同一種類型對待,可對這些不同的類型進行相同的處理,例如toString方法

3.2 綁定

將一個方法調(diào)用和一個方法主體連接到一起成為綁定

4 內(nèi)部類

定義在別的類內(nèi)部、函數(shù)內(nèi)部的類

內(nèi)部類能直接訪問外部的全部資源,包括任何私有的成員

外部是函數(shù)時,只能訪問那個函數(shù)里final的變量,因為方法中定義的變量是局部的,當(dāng)方法的聲明周期結(jié)束時,方法中變量的生存期也結(jié)束了,但方法中定義的內(nèi)部類的實例可能還在被引用。

4.1 常規(guī)內(nèi)部類

OuterClass、InnerClass分別是外部類和內(nèi)部類,out是OuterClass的引用,則在OuterClass外部實例化InnerClass的代碼片段為:

OuterClass out = new OuterClass();

OuterClass.InnerClass in = out.new InnerClass();

OuterClass.InnerClass in = new OuterClass().new InnerClass();

4.2 在方法中的內(nèi)部類

對方法中定義的內(nèi)部類實例化,必須在定義的的方法中,而且必須在內(nèi)部類定義后方可對其實例化。

4.3 匿名內(nèi)部類

匿名內(nèi)部類時沒有名字的內(nèi)部類,一般可分為兩種:常規(guī)定義的內(nèi)部類;作為方法的參數(shù)定義的匿名內(nèi)部類。常規(guī)定義的匿名內(nèi)部類的聲明和使用采用如下格式:

Classname classname = new Classname(){

//類體

}; //注意,必須跟分號

其中,Classname是類或接口名,注意這是一個表達式,它返回一個對象,可以用在需要引用該對象的任何地方。

匿名內(nèi)部類的方便之處:

該句法定義了一個類,但不需要類的類型;

匿名類實現(xiàn)了一個接口或繼承另一個類,而不需要使用implements或extends關(guān)鍵字

4.4 靜態(tài)內(nèi)部類

使用了修飾符static的內(nèi)部類,稱為靜態(tài)內(nèi)部類。靜態(tài)內(nèi)部類與包含類的實例沒有實際的聯(lián)系,因此,不能訪問包含類中的非靜態(tài)成員。實例化靜態(tài)內(nèi)部類時,與常規(guī)內(nèi)部類實例化不同。

實例化InnerClass代碼片段如下:

OuterClass.InnerClass in = new OuterClass.InnerClass();

一個類OuterClass中有另一個類InnerClass(外部類和內(nèi)部類), 如果在main函數(shù)中使用new 的方式創(chuàng)建內(nèi)部類的對象,會報錯:No enclosing instance of type OuterClass is accessible.

1、原因:

內(nèi)部類是動態(tài)的(無static關(guān)鍵字修飾),而main方法是靜態(tài)的,普通的內(nèi)部類對象隱含地保存了一個引用,指向創(chuàng)建它的外圍類對象,所以要在static方法(類加載時已經(jīng)初始化)調(diào)用內(nèi)部類的必須先創(chuàng)建外部類。

2、解決辦法:

創(chuàng)建內(nèi)部類對象應(yīng)該:

方法1:外部類對象.內(nèi)部類對象 (保證外部類對象先于內(nèi)部類對象出現(xiàn))

InnerClass in = new OuterClass().InnerClass();

方法2:

如果將內(nèi)部類修改為靜態(tài)類,可以在main中直接創(chuàng)建內(nèi)部類實例。

static class InnerClass{

...

}

當(dāng)在包含類內(nèi)部實例化內(nèi)部類時,可以直接對內(nèi)部類實例化。如果在包含類的外部實例化內(nèi)部類,則需要使用包含類的一個引用來實例化。

4.5 匿名類

在new對象的時候就給出類的定義形成了匿名類

匿名類可以繼承某類,也可以實現(xiàn)某接口

Swing的消息機制廣泛使用匿名類

總結(jié)

以上是生活随笔為你收集整理的java中塑形_Java学习5——接口和多态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。