內(nèi)部類
4.1 內(nèi)部類概念
? 什么是內(nèi)部類
將類寫(xiě)在其他類的內(nèi)部耗拓,可以寫(xiě)在其他類的成員位置和局部位置者春,這時(shí)寫(xiě)在其他類內(nèi)部的類就稱為內(nèi)部類栅隐。其他類也稱為外部類膘侮。
? 什么時(shí)候使用內(nèi)部類
在描述事物時(shí)屈糊,若一個(gè)事物內(nèi)部還包含其他可能包含的事物,比如在描述汽車時(shí)琼了,汽車中還包含這發(fā)動(dòng)機(jī)逻锐,這時(shí)發(fā)動(dòng)機(jī)就可以使用內(nèi)部類來(lái)描述。
class 汽車 { //外部類
class 發(fā)動(dòng)機(jī) { //內(nèi)部類
}
}
? 內(nèi)部類的分類
內(nèi)部類分為成員內(nèi)部類與局部?jī)?nèi)部類雕薪。
我們定義內(nèi)部類時(shí)昧诱,就是一個(gè)正常定義類的過(guò)程,同樣包含各種修飾符所袁、繼承與實(shí)現(xiàn)關(guān)系等盏档。在內(nèi)部類中可以直接訪問(wèn)外部類的所有成員。
4.2 成員內(nèi)部類
成員內(nèi)部類燥爷,定義在外部類中的成員位置蜈亩。與類中的成員變量相似,可通過(guò)外部類對(duì)象進(jìn)行訪問(wèn)
? 定義格式
class 外部類 {
修飾符 class 內(nèi)部類 {
//其他代碼
}
}
? 訪問(wèn)方式
外部類名.內(nèi)部類名 變量名 = new 外部類名().new 內(nèi)部類名();
? 成員內(nèi)部類代碼演示
定義類
class Body {//外部類前翎,身體
private boolean life= true; //生命狀態(tài)
public class Heart { //內(nèi)部類稚配,心臟
public void jump() {
System.out.println("心臟噗通噗通的跳")
System.out.println("生命狀態(tài)" + life); //訪問(wèn)外部類成員變量
}
}
}
訪問(wèn)內(nèi)部類
public static void main(String[] args) {
//創(chuàng)建內(nèi)部類對(duì)象
Body.Heart bh = new Body().new Heart();
//調(diào)用內(nèi)部類中的方法
bh.jump();
}
4.3 局部?jī)?nèi)部類
局部?jī)?nèi)部類,定義在外部類方法中的局部位置港华。與訪問(wèn)方法中的局部變量相似道川,可通過(guò)調(diào)用方法進(jìn)行訪問(wèn)
? 定義格式
class 外部類 {
修飾符 返回值類型 方法名(參數(shù)) {
class 內(nèi)部類 {
//其他代碼
}
}
}
? 訪問(wèn)方式
在外部類方法中,創(chuàng)建內(nèi)部類對(duì)象立宜,進(jìn)行訪問(wèn)
? 局部?jī)?nèi)部類代碼演示
定義類
class Party {//外部類冒萄,聚會(huì)
public void puffBall(){// 吹氣球方法
class Ball {// 內(nèi)部類,氣球
public void puff(){
System.out.println("氣球膨脹了");
}
}
//創(chuàng)建內(nèi)部類對(duì)象橙数,調(diào)用puff方法
new Ball().puff();
}
}
訪問(wèn)內(nèi)部類
public static void main(String[] args) {
//創(chuàng)建外部類對(duì)象
Party p = new Party();
//調(diào)用外部類中的puffBall方法
p.puffBall();
}
4.4 內(nèi)部類的實(shí)際使用——匿名內(nèi)部類
4.4.1 匿名內(nèi)部類概念
內(nèi)部類是為了應(yīng)對(duì)更為復(fù)雜的類間關(guān)系晃酒。查看源代碼中會(huì)涉及到啤咽,而在日常業(yè)務(wù)中很難遇到,這里不做贅述。
最常用到的內(nèi)部類就是匿名內(nèi)部類劣砍,它是局部?jī)?nèi)部類的一種宇立。
定義的匿名內(nèi)部類有兩個(gè)含義:
? 臨時(shí)定義某一指定類型的子類
? 定義后即刻創(chuàng)建剛剛定義的這個(gè)子類的對(duì)象
4.4.2 定義匿名內(nèi)部類的作用與格式
作用:匿名內(nèi)部類是創(chuàng)建某個(gè)類型子類對(duì)象的快捷方式黔帕。
格式:
new 父類或接口(){
//進(jìn)行方法重寫(xiě)
};
? 代碼演示
//已經(jīng)存在的父類:
public abstract class Person{
public abstract void eat();
}
//定義并創(chuàng)建該父類的子類對(duì)象确憨,并用多態(tài)的方式賦值給父類引用變量
Person p = new Person(){
public void eat() {
System.out.println(“我吃了”);
}
};
//調(diào)用eat方法
p.eat();
使用匿名對(duì)象的方式,將定義子類與創(chuàng)建子類對(duì)象兩個(gè)步驟由一個(gè)格式一次完成瞪醋,忿晕。雖然是兩個(gè)步驟,但是兩個(gè)步驟是連在一起完成的银受。
匿名內(nèi)部類如果不定義變量引用践盼,則也是匿名對(duì)象鸦采。代碼如下:
new Person(){
public void eat() {
System.out.println(“我吃了”);
}
}.eat();