天天看點

了解java内部類

内部類概念

1)什麼是内部類

将類寫在其他類的内部,可以寫在其他類的成員位置和局部位置,這時寫在其他類内部的類就稱為内部類。其他類也稱為外部類。

2)什麼時候使用内部類

在描述事物時,若一個事物内部還包含其他可能包含的事物,比如在描述汽車時,汽車中還包含這發動機,這時發動機就可以使用内部類來描述。

class 汽車 { //外部類
	class 發動機 { //内部類
        }
}
           

3)内部類的分類

内部類分為成員内部類與局部内部類。

定義内部類時,就是一個正常定義類的過程,同樣包含各種修飾符、繼承與實作關系等。在内部類中可以直接通路外部類的所有成員。

成員内部類

成員内部類,定義在外部類中的成員位置。與類中的成員變量相似,可通過外部類對象進行通路

1)定義格式

class 外部類 { 
	修飾符 class 内部類 {
		//其他代碼
        }
}
           

2)通路方式

外部類名.内部類名 變量名 = new 外部類名().new 内部類名();
           

3)成員内部類代碼示範

定義類

class Body {//外部類,身體
        private boolean life= true; //生命狀态
        public class Heart { //内部類,心髒
	    public void jump() {
                System.out.println("心髒噗通噗通的跳")
	        System.out.println("生命狀态" + life); //通路外部類成員變量
            }
        }
}
           

通路内部類

public static void main(String[] args) {
	//建立内部類對象
	Body.Heart bh = new Body().new Heart();
	//調用内部類中的方法
	bh.jump();
}
           

局部内部類

局部内部類,定義在外部類方法中的局部位置。與通路方法中的局部變量相似,可通過調用方法進行通路

定義格式

class 外部類 { 
        修飾符 傳回值類型 方法名(參數) {
                class 内部類 {
                    //其他代碼
                }
        }
}
           

通路方式

在外部類方法中,建立内部類對象,進行通路
           

局部内部類代碼示範

// 定義類
class Party {//外部類,聚會
        public void puffBall(){// 吹氣球方法
	        class Ball {// 内部類,氣球
                        public void puff(){
                             System.out.println("氣球膨脹了");
                        }
                }
                //建立内部類對象,調用puff方法
                new Ball().puff();
        }
}

// 通路内部類
public static void main(String[] args) {
	//建立外部類對象
	Party p = new Party();
	//調用外部類中的puffBall方法
	p.puffBall();
}
           

内部類的實際使用——匿名内部類

匿名内部類概念

内部類是為了應對更為複雜的類間關系。檢視源代碼中會涉及到,而在日常業務中很難遇到,這裡不做贅述。

最常用到的内部類就是匿名内部類,它是局部内部類的一種。

定義的匿名内部類有兩個含義:

1)臨時定義某一指定類型的子類

2)定義後即刻建立剛剛定義的這個子類的對象

定義匿名内部類的作用與格式

作用:匿名内部類是建立某個類型子類對象的快捷方式。

格式:

new 父類或接口(){
	//進行方法重寫
};
           

代碼示範

//已經存在的父類:
public abstract class Person{
	public abstract void eat();
}
//定義并建立該父類的子類對象,并用多态的方式指派給父類引用變量
Person  p = new Person(){
	public void eat() {
		System.out.println(“我吃了”);
        }
};
//調用eat方法
p.eat();
           

使用匿名對象的方式,将定義子類與建立子類對象兩個步驟由一個格式一次完成。雖然是兩個步驟,但是兩個步驟是連在一起完成的。

匿名内部類如果不定義變量引用,則也是匿名對象。代碼如下:

new Person(){
	public void eat() {
		System.out.println(“我吃了”);
        }
}.eat();