1. 程式人生 > 實用技巧 >CentOS7升級核心版本

CentOS7升級核心版本

內部類

  • 概述

    如果一個事物的內部有同事包含另一個事務,那麼這就是一個類的內部包含了另一個類。

    列如:身體和心臟的關係 “has - a”包含關係。(心臟屬於身體的一部分,身體包含心臟)

    ​ 汽車和發動機的關係 “has - a”包含關係。 (發動機屬於汽車的一部分,汽車包含發動機)

  • 定義

    Java中允許將一個類A宣告在另一個類B中,則類A就是內部類,類B稱為外部類.

  • 分類

    1. 成員內部類

      定義在類中方法外的類
      

      格式

      修飾符 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();// 呼叫內佈列方法
     	}
     	
     }
  1. 區域性內部類 (包含匿名內部類)

      定義在類的方法的內部
      “區域性”只有當前所屬的方法內才能使用它,出來這個方法外面就不能用了
    

    格式

      修飾符 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