一笨觅、內(nèi)部類概念
什么是內(nèi)部類
將類寫在其他類的內(nèi)部拦耐,可以寫在其他類的成員位置和局部位置,這時(shí)寫在其他類內(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)外部類的所有成員涛癌。
二犯戏、成員內(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();
}
三、局部?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();
}
四、匿名內(nèi)部類
匿名內(nèi)部類局部?jī)?nèi)部類的一種送滞,定義的匿名內(nèi)部類有兩個(gè)含義:
? 臨時(shí)定義某一指定類型的子類
? 定義后即刻創(chuàng)建剛剛定義的這個(gè)子類的對(duì)象
作用:匿名內(nèi)部類是創(chuàng)建某個(gè)類型子類對(duì)象的快捷方式侠草。
使用匿名內(nèi)部類的方式辱挥,可以將定義子類與創(chuàng)建子類對(duì)象兩個(gè)步驟由一個(gè)格式一次完成犁嗅。雖然是兩個(gè)步驟,但是兩個(gè)步驟是連在一起完成的晤碘。
格式:
new 父類或接口(){
//進(jìn)行方法重寫
};
? 代碼演示
//已經(jīng)存在的父類:
public abstract class Person {
public abstract void eat();
}
1. 使用匿名內(nèi)部類定義并創(chuàng)建該父類的子類對(duì)象褂微,并用多態(tài)的方式賦值給父類引用變量
class Test {
public static void main(String[] args) {
//定義并創(chuàng)建該父類的子類對(duì)象,并用多態(tài)的方式賦值給父類引用變量
Person p = new Person() {
public void eat() {
System.out.println("我吃了");
}
};
//調(diào)用eat方法
p.eat();
}
}
2. 匿名內(nèi)部類如果不定義變量引用园爷,則屬于匿名對(duì)象
class Test {
public static void main(String[] args) {
//定義并創(chuàng)建該父類的子類對(duì)象宠蚂,并用多態(tài)的方式賦值給父類引用變量
new Person() {
public void eat() {
System.out.println("我吃了");
}
}.eat();
}
}