iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0

靜態內部類

就是加上static的內部類別,其特色就和一般的 static 成員一樣, 可以直接透過外部類別的名稱來存取,而不用先建立外部類別的物件。

注意:

  1. static變數一樣,它只是屬於某一個類別,並不是類別中的實體。
  2. 靜態內部類別本身並沒有this參考指標指向外部類別,所以無法透過隱含的 this 指標取得外部類別的實體變數
  3. 外部類別有宣告static變數,因為都被配置在記憶體中的 Global 區塊內,所以可以相互看見並存取。
  4. 靜態內部類別中可同時定義static與非static成員(變數或方法),在其他非靜態的內部類別中則不可以宣告static成員。

在外部類別以外使用靜態內部類別的語法

new OuterClass.InnerConstructor()

public class Demo01 {
	public static void main(String[] args) {
		Outer.MyStatic.fooB();
		Outer.MyStatic s = new Outer.MyStatic();
		s.fooA();
		s.fooB();
		
	}
}

class Outer {
	private int x = 7;
	private static int y = 9;

	static class MyStatic {
		private int a = 77;
		private static int b = 99;
		//static class內部只能讀取外部類的static屬性
		public void fooA() {
			System.out.println("Hello static inner class A.");
			System.out.println(b);
			System.out.println(Outer.y);
			System.out.println(a);
			System.out.println(this.a);
			//System.out.println(Outer.this.x);
		}
		//static只能讀取static屬性
		public static void fooB() {
			System.out.println("Hello static inner class B.");
			System.out.println(b);
			//System.out.println(a);
			System.out.println(Outer.y);
			//System.out.println(new Outer().x);
		}
	}
}

Java 可以在interface 裡定義內部類別,介面裡面定義的內部類別預設使用public static 修飾,也就是介面內部類別只能是靜態內部類別

那既然內部類是外部類別的成員,那可以在子類別中定義一個內部類覆寫其父類別

的內部類嗎?

答案是不行!因為內部類的類別名稱還有將外部類當作命名空間,所以子類別的內部類和父類別的內部類不可能完全同名,就不可以覆寫!

匿名內部類

主要是用來臨時定義一個某類別(或介面) 的子類別,沒有名稱,只有{...},使用時通常直接以 new關鍵字來建立的類別實體。

注意:

  1. 因為沒有名稱所以只能使用一次。
  2. 不能是抽象類別
  3. 不能定義建構子
  4. 在敘述中使用匿名類別時,最後必須加上分號才行。
  5. 抽象類別或介面也可用來建立匿名類別,但在匿名類別中必須實作所有未實做的方法
  6. 在匿名類別中也可以宣告新的變數或方法,但由於所產生的物件會交由父類別的變數來參照, 所以透過該參照也只能存取父類別所擁有的成員, 而不能存取子類別新增的成員, 否則會編譯錯誤。
  7. 存取局部變數等同於自動使用final,所以不能重新賦值

定義匿名內部類的格式:

new 實作介面() | 父類別建構子(實際參數列表){
	//匿名內部類別的類別體部分
}
public class AnonymousDemo {
	
	public static void main(String[] args) {
		Drink d1 = new Drink("果汁",35) {
			int getPrice() {return price * 2;}
		};
		System.out.println("*2: " + d1.getPrice());
		
		Drink d2 = new Drink("果汁",35) {
			int getPrice() {return price * 3;}
		};
		System.out.println("*3: " +d2.getPrice());
	}
}
//--------------------
class Drink{
	String name;
	int price;
	public Drink(String name, int price) {
		super();
		this.name = name;
		this.price = price;
	}
	void setPrice(int a) {this.price = a;}
	int getPrice() {return price;}
	void drink() {System.out.println("NO");}
}

上一篇
Day 26 內部類 II
下一篇
Day 28 集合泛型 I
系列文
玩轉Java:從基礎打造你的程式超能力30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言