2019-10-29-23:08:00 目錄 1.內部類 2.成員內部類 3.局部內部類 4.局部內部類的final問題 5.匿名內部類 內部類: what:內部類(nested classes),面向對象程式設計中,可以在一個類的內部定義另一個類 分類: 1.成員內部類 2.局部內部類(包含匿名內 ...
2019-10-29-23:08:00
目錄
1.內部類
2.成員內部類
3.局部內部類
4.局部內部類的final問題
5.匿名內部類
內部類:
what:內部類(nested classes),面向對象程式設計中,可以在一個類的內部定義另一個類
分類:
1.成員內部類
2.局部內部類(包含匿名內部類)
成員內部類:
格式:
修飾符 class 外部類名稱{
修飾符 class 內部類名稱{
語句體;
}
語句體;
}
註意:內用外,可以隨意訪問,外用內,需要內部類對象
使用方式:
1.間接方式:在外部類的方法當中,使用內部類:然後main只是調用外部類的方法。
2.直接方式,公式,
類名稱 對象名 = new 類名稱();
1 package demosummary.inner;
2
3 public class Body {
4
5 public class Heart{
6 public void beat(){
7 System.out.println("心臟時時刻刻在跳動");
8 }
9 }
10
11 public void move(){
12 System.out.println("身體時時刻刻都在動");
13 }
14
15 public static void main(String[] args) {
16 Body body = new Body();
17 body.move();
18 Body.Heart heart = new Body().new Heart();
19 heart.beat();
20 }
21 }
1 package demosummary.inner;
2 //定義一個外部類
3 public class Outer {
4 //定義一個外部類成員變數
5 int num = 10;
6 //定義一個內部類
7 public class Inner{
8 //定義一個內部類成員變數
9 int num = 20;
10 //定義一個內部類成員方法
11 public void innerMethod(){
12 //內部類成員方法的局部變數
13 int num = 30;
14 System.out.println(num);//就近原則,輸出局部變數
15 System.out.println(this.num);//輸出內部類成員變數
16 System.out.println(Outer.this.num);//輸出外部類成員變數
17 }
18 }
19 }
局部內部類:
what:如果一個類是定義在一 個方法內部的,那麼這就是一 個局部內部類。局部”,只有當前所屬的方法才能使用它,出了這個方法外面就不能用了。
格式:
修飾符 class 外部類名稱{
修飾符 返回值類型 外部類方法名稱(參數列表){
class 局部內部類{
語句體;
}
}
}
1 package demosummary.inner;
2 //定義一個外部類
3 public class Outer01 {
4 //定義一個外部類成員變數
5 int num = 10;
6 //定義一個外部類成員方法
7 public void outer01Method(){
8 //定義一個外部類成員方法的局部變數
9 int num = 20;
10 //定義一個局部內部類
11 class Inner01{
12 //定義一個局部內部類的成員變數
13 int num = 30;
14 //定義一個局部內部類的成員方法
15 public void inner01Method(){
16 System.out.println(num);//30
17 }
18 }
19 Inner01 inner01 = new Inner01();
20 inner01.inner01Method();//調用當前所屬方法的局部內部類的方法
21 System.out.println(num);//20
22 }
23
24 public static void main(String[] args) {
25 Outer01 outer01 = new Outer01();
26 outer01.outer01Method();//能調用外部類的成員方法,不能調用局部內部類的成員方法
27 System.out.println(outer01.num);//10
28 // Inner01 inner01 = new Inner01();//會報錯,不能創建局部內部類的對象
29 // inner01.inner01Method();//會報錯,局部內部類的方法只能在其所屬的方法中調用
30 }
31 }
局部內部類的final問題:
局部內部類,如果希望訪問所在方法的局部變數,那麼這個局部變數必須是[有效final的]
備註:從Java 8+開始,只要局部變數事實不變,那麼final關鍵字可以省略。
原因:
1. new出來的對象在堆記憶體當中。
2. 局部變數是跟著方法走的,在棧記憶體當中。
3.方法運行結束之後,立刻出棧,局部變數就會立刻消失。
4.但是new出來的對象會在堆當中持續存在,直到垃圾回收消失。
匿名內部類:
如果介面的實現類(或者是父類的子類)只需要使用唯一的一次,那麼這種情況下就可以省略掉該類的定義,而改為使用[匿名內部類]。
格式:
介面名稱 對象名 = new 介面名稱(){
//覆蓋重寫所有抽象方法
}
對格式"new 介面名稱() {...}"進行解析
1. new代表創建對象的動作
2.介面名稱就是匿名內部類需要實現哪個介面
3. {... }這才是匿名內部類的內容
另外還要註意幾點問題,
1.匿名內部類,在[創建對象]的時候,只能使用唯一次。如果希望多次創建對象,而且類的內容一樣的話,那麼就必須使用單獨定義的實現類了
2.匿名對象,在[調用方法]的時候,只能調用唯一次。如果希望同一個對象,調用多次方法,那麼必須給對象起個名字。
3.匿名內部類是省略了[實現類/子類名稱],但是匿名對象是省略了[對象名稱]
強調:匿名內部類和匿名對象不是一回事! ! !