iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
自我挑戰組

前端工程師的java學習紀錄系列 第 26

Day26-內部類、匿名類

  • 分享至 

  • xImage
  •  

內部類、匿名類

內部類

當類是定義在其他的類裡面時,可以說它是內部類

可以定義的位置:

  • class
  • 構造器
  • 初始化區塊
  • 方法

類只會使用publicdefault進行權限的修飾。

內部類可以使用4種權限修飾(privatedefaultprotectedpublic ),並且也可以使用static 將內部類變成靜態

public class A {

	public class B {}

	public static class C {}
	
	public A() {
		public class D {}
	}
	
	{
		public class E {}
	}
	
	public void method() {
		public class F {
			void method() {
			System.out.println("方法中的局部內部類");
			}
		}
		F f = new F();
		f.method(); // 方法中的局部內部類
	}
}

當要實例化一個內部類時使用這樣的方式:

public class Test {
	public static void main(String[] args) {
	
		A a = A.new B();
		
		A b = new A.C();
		
	}
}
  • 非靜態內部類實例化:A a = A.new B(); ,要記得super class 的型別是放在new 的前面。
  • 靜態內部類實例化:A b = new A.C(); ,這邊是使用A. 的方式,因為C靜態內部類 ,所以當A 載入時,就已經存在了,只是尚未被實例化。

匿名類

在方法中定義一個局部內部類,並且用一般實例化類的方式後使用類的方法。

public class A {

	public void method() {
		public class F {
			void method() {
			System.out.println("方法中的局部內部類");
			}
		}
		F f = new F();
		f.method(); // 方法中的局部內部類
	}
	
}

運用多態的概念定義了一個繼承B 的匿名類。

public class A {

	public void method() {
	
		B b = new B() {
			@override
			void method() {
				System.out.println("方法中的局部匿名內部類1");
			}
		}
		b.method(); //方法中的局部匿名內部類1
	}
	
}

public class B {
	void method() {
			System.out.println("方法中的局部內部類");
		}
}

💡雖然b 看起來好像是B 的類別,但實際上它是透過多態 的方式,繼承B匿名類

這邊可以看到,在new B() 這個構造器後面加上了{}

完全匿名,連物件的名稱都沒有。

public class A {

	public void method() {
	
		new B() {
			@override
			void method() {
				System.out.println("方法中的局部匿名內部類1");
			}
		}.method(); //方法中的局部匿名內部類1
	}
	
}

public class B {
	void method() {
			System.out.println("方法中的局部內部類");
		}
}

💡也可以使用這種方式,連物件都不宣告了,直接在匿名類 的後面使用匿名類 中的方法


一般在開發中較少使用到內部類 的形式,但是匿名類 還是有機會會遇到~~~


上一篇
Day25-接口interface
下一篇
Day27-枚舉類enum
系列文
前端工程師的java學習紀錄37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言