public class Demo4 {
public static void main(String[] args) {
Person_Name p1 = new Person_Name(); // 編譯錯誤:找不到符號
p1.speak();
}
class Person_Name { // 非靜態內部類
public void speak() {
System.out.println("我是一個好人");
}
}
}
Person_Name 定義在 Demo4 內部,且**未聲明 static**new Person_Name() 隱含調用 this.new Person_Name(),但 main 是靜態方法,無 this 引用public class Demo4 {
public static void main(String[] args) {
// 靜態內部類可直接實例化
Person_Name p1 = new Person_Name();
p1.speak();
}
static class Person_Name { // 關鍵:加上 static
public void speak() {
System.out.println("我是一個好人");
}
}
}
優點:語法簡潔,無需外部實例,符合工具類設計模式。
public class Demo4 {
public static void main(String[] args) {
Demo4 outer = new Demo4(); // 創建外部實例
Person_Name p1 = outer.new Person_Name(); // 通過外部實例創建內部實例
p1.speak();
}
class Person_Name { // 非靜態
public void speak() {
System.out.println("我是一個好人");
}
}
}
適用場景:內部類確實需要訪問外部類實例成員時。
// 獨立文件 Person_Name.java
public class Person_Name {
public void speak() {
System.out.println("我是一個好人");
}
}
// Demo4.java
public class Demo4 {
public static void main(String[] args) {
Person_Name p1 = new Person_Name();
p1.speak();
}
}
建議:無特殊封裝需求時,優先使用頂層類。
| 類型 | 聲明位置 | 實例化語法 | 訪問外部成員 |
|---|---|---|---|
| 靜態內部類 | 類內部,static 修飾 | new Outer.Inner() | 僅靜態成員 |
| 非靜態內部類 | 類內部,無 static | outer.new Inner() | 所有成員(含私有) |
| 局部內部類 | 方法/代碼塊內 | 方法內 new Inner() | final/效果上 final 的局部變量 |
| 匿名內部類 | 表達式中 | new Interface(){...} | 同局部內部類 |
本質上,找不到符號: Person_Name 是因為編譯器在靜態上下文中尋找無參構造器失敗。添加 static 或提供外部實例即可解決。