CentOS7升級核心版本
阿新 • • 發佈:2020-11-27
內部類
-
概述
如果一個事物的內部有同事包含另一個事務,那麼這就是一個類的內部包含了另一個類。
列如:身體和心臟的關係 “has - a”包含關係。(心臟屬於身體的一部分,身體包含心臟)
汽車和發動機的關係 “has - a”包含關係。 (發動機屬於汽車的一部分,汽車包含發動機)
-
定義
Java中允許將一個類A宣告在另一個類B中,則類A就是內部類,類B稱為外部類.
-
分類
-
成員內部類
定義在類中方法外的類
格式
修飾符 class 外部類名稱{ //... 修飾符 class 內部類名稱{ //... } } 在描述事物時,如果一個事物內部包含了另外的其他事物,就可以使用內部類這種內部類這中介面。定義在 【成員變數的位置】。 //內部類訪問外部類的資訊隨意訪問,外部類訪問內部類的資訊,需要內部類物件。
使用成員內部類有兩種方式
1. 間接方式: 在外部類的方法當中,使用內部類 2. 直接方式: 格式: //1 外部類名.內部類類名 物件名 = new 外部類名().new 內部類名(); //2 內部類類名 物件名 = new 外部類名().new 內部類名();//需要導包 import 包名.外部類名.內部類名;
-
// 如果出現重名現象,那麼格式是:外部類名稱.this.外部類的成員變數名 public class OuterClass { String name = "小劉";// 外部類的成員變數 public class InnerClass { String name = "小花";// 內部類的成員變數 public void methodInner(){ String name = "小王";// 內部類方法內部的區域性變數 System.out.println(name);// 小王 區域性變數 就近原則 System.out.println(this.name);// 小花 內部類的成員變數 // 狸貓換太子 System.out.println(new OuterClass().name);// 小劉 外部類的成員變數 } } // 間接方式 public void methodOuter() { System.out.println("外部類的方法在載入。。。。"); InnerClass inner = new InnerClass(); inner.methodInner();// 呼叫內佈列方法 } }
-
區域性內部類 (包含匿名內部類)
定義在類的方法的內部 “區域性”只有當前所屬的方法內才能使用它,出來這個方法外面就不能用了
格式
修飾符 class 外部類名稱{ //方法 修飾符 返回值型別 外部類方法名稱 (引數列表){ class 區域性內部類名稱{ //。。。 } } }
public class OuterClass { // 外部類 // 定義外部類方法 public void methodOuter() { final int num;// 所在方法的區域性變數 預設是有final關鍵字修飾的 num = 20; // 定義區域性內部類 class InnerClass { // 定義區域性內部類的方法 public void methodInner() { System.out.println(num);// 10 } } // 在方法內部使用它 InnerClass innerClass = new InnerClass(); innerClass.methodInner(); } } //呼叫 public static void main(String[] args) { // 輸出num值 // 呼叫methodInner() // 例項化一個外部類的物件 OuterClass outerClass = new OuterClass(); outerClass.methodOuter(); }
區域性內部類訪問外部類的方法中的區域性變數
在區域性內部類的方法中想要訪問方法的區域性變數的話,要求此區域性變數宣告為final的。 jdk 7及之前版本:要求此區域性變數顯式的宣告為final的 jdk 8及之後的版本:可以省略final的宣告 原因: 1.new出來的物件儲存在對用的記憶體當中的 2.區域性變數是隨著方法的壓棧而在記憶體當中儲存 3.方法執行結束後,立刻彈棧,區域性變數在記憶體當中消失了 4.但是new出來的物件並不會隨著方法的彈棧而立刻消失,知道JVM把他認為是垃圾,才會回收消失掉。 * public > protected > (default) > private * 類的許可權修飾符: * 定義一個類的時候,許可權修飾符的規則: * 1. 外部類: public 、(default) * 2.成員內部類: public 、 protected、(default)、private * 3.區域性內部類: 什麼都不能寫
-
匿名內部類【重要】
概念:
是內部類的簡寫。他的本質其實是一個 帶著具體實現父類或者介面的匿名的 子類物件 開發中,最常用到的內部類是【匿名內部類】
前提
匿名內部類必須【繼承一個父類】或者【實現一個介面】,伴隨著重寫父類或者父介面當中的抽象方法
格式
new 父類名或者父介面名{ //方法的重寫 @Oberride public void method(){ //重寫的方法體內容 } }; //通常在方法的形參引數是介面或者抽象類時,一般將匿名內部類作為實參進行傳遞
//定義一個介面 public interface Animal{ public abstract void eat(); } //定義一個啟動類 public class Text{ public static void showEat(){ animal.eat(); } public static void main(String[] args){ //採用匿名內部類的方式來寫 //多型寫法 //等號左邊 介面 //等號右邊 本質是Animal介面的子類物件 Animal a = new Animal(){ @Override public void eat(){ System.out.println("貓吃魚"); } }; showEat(eat);//貓吃魚 //簡化 //匿名物件 showEat(new Animal(){ @Override public void eat(){ System.out.println("貓吃魚"); } }); } }
對格式<<new 介面名稱 (){}>>分析
* 對格式<<new 介面名稱 (){}>>分析 * 1.new代表建立物件 * 2.介面名稱就是匿名內部類實現的那個介面,同時需要建立那個介面實現類的物件 * 3.{}這是匿名內部類的內容 * * 使用匿名內部類注意事項: * 1.匿名內部類,在【建立物件】時,只能使用唯一一次 * 如果希望對此建立物件,而且類的內容是一樣大的,建議單獨定義實現類。 * 2.匿名物件,在【呼叫方法】時,也只能使用唯一一次 * 如果希望同一個物件呼叫多次方法,那麼建議給物件起個名字 * 3.匿名內部類省略了【實現類/子類名稱】,但是匿名物件是省略了【物件名】 * 備註;匿名內部類和匿名物件兩個根本就不是一回事!
總結
成員內部類和區域性內部類,在編譯以後,都會生成位元組碼檔案。 格式: 成員內部類:外部類$內部類名.class 區域性內部類:外部類$數字內部類名.class