天天看點

Java學習總結(六) —— 内部類一、内部類二、匿名内部類

Java學習總結(六) —— 内部類

  • 一、内部類
    • 1. 概述
    • 2. 内部類的通路
  • 二、匿名内部類
    • 1. 基本使用方法
    • 2. 作為參數傳遞

一、内部類

1. 概述

将一個類A定義在另一個類B裡面,裡面的那個類A就稱為 内部類 ,B則稱為外部類。

代碼如下:

public class A{
	class B{
	}
}
           

2. 内部類的通路

  • 1.内部類可以直接通路外部類的成員,包括私有成員。
  • 2.外部類要通路内部類的成員,必須要建立内部類的對象。

代碼如下:

class Animal {
	    private boolean CAT = true;
		// 内部類
	    class Cat {
	        public void isCat() {
	            // 内部類可以直接通路外部類的成員變量
	            if (CAT) {
	                System.out.println("喵喵喵");
	            } else {
	                System.out.println("汪汪汪");
	            }
	        }
	    }
	
	    public void changeToCat() {
	        this.CAT = true;
	    }
	
	    public void changeToDog() {
	        this.CAT = false;
	    }
	}
	// 測試類
	class Test01 {
	    public static void main(String[] args) {
	        // 建立外部類對象
	        Animal animal = new Animal();
	        // 建立内部類對象
	        Animal.Cat Jim = animal.new Cat();
	
	        // 調用内部方法
	        Jim.isCat();
	        // 調用外部方法
	        animal.changeToDog();
	        // 調用内部方法
	        Jim.isCat();
	    }
	}
           

輸出結果:

喵喵喵
	汪汪汪
           

重點:

  • 内部類仍然是一個獨立的類,在編譯之後會内部類會被編譯成獨立的.class檔案,但是前面冠以外部類的類名和$符号 。
  • 比如,Animal$Cat.class

二、匿名内部類

匿名内部類:是内部類的簡化格式,匿名内部類的本質是一個 帶着具體實作的父類或父接口的匿名的 子類對象。

傳統實作接口的步驟為:

  • 1.建立接口
  • 2.定義子類
  • 3.重寫接口的方法
  • 4.建立子類對象
  • 5.調用重寫後的方法

是以針對以上繁瑣的步驟,提出了匿名内部類來簡化開發的步驟。

【前提】匿名内部類必須繼承一個父類或者實作一個父接口。

代碼如下:

new 父類名或者接口名(){ 
		// 方法重寫 
		@Override 
		public void method() { 
			// 執行語句 
		} 
	};
           

1. 基本使用方法

舉個例子,代碼如下:

abstract class Fruit {
	    public abstract void eat();
	}
	
	class InnerDemo {
	    public static void main(String[] args) {
		    /*
		    1.等号右邊:是匿名内部類,定義并建立該接口的子類對象 
		    2.等号左邊:是多态指派,接口類型引用指向子類對象 
		    */
	        Fruit fruit = new Fruit() {
	            @Override
	            public void eat() {
	                System.out.println("甜滋滋的");
	            }
	        };
	        fruit.eat();
	    }
	}
           

輸出結果:

甜滋滋的
           

2. 作為參數傳遞

另一種使用方法是将匿名内部類作為參數傳遞,通常在方法的形式參數是接口或者抽象類時使用。

代碼如下:

abstract class Fruit {
	    public abstract void eat();
	}
	
	class InnerDemo {
	    public static void main(String[] args) {
	        show(new Fruit() {
	            @Override
	            public void eat() {
	                System.out.println("甜滋滋的");
	            }
	        });
	    }
	    public static void show(Fruit fruit) {
	        fruit.eat();
	    }
	}
           

輸出結果:

甜滋滋的