就是加上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關鍵字來建立的類別實體。
注意:
定義匿名內部類的格式:
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");}
}