當外部類 A 定義了一個內部類 B,且項目中還存在一個同名的頂層類 B 時,在 A 內部直接 `new B()` 只能實例化內部類 B,無法直接訪問外部同名類 B。
class A {
class B { } // 內部類 B(甲)
}
class B { } // 頂層類 B(乙)
在外部類 A 中創建頂層類 B 的對象,需使用完整包名+類名,或利用 Class.forName() 反射獲取。
class A {
class B { }
void createOuterB() {
// 假設頂層類 B 在包 com.example 中
com.example.B outerB = new com.example.B();
}
}
try {
Class> clazz = Class.forName("com.example.B");
Object outerB = clazz.getDeclaredConstructor().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
B 在默認包(無包名)中,則無法通過限定名區分,建議避免使用默認包,或重命名類以消除歧義。命名規範上盡量避免內部類與頂層類同名;若不可避免,統一使用包名限定,保持代碼清晰可維護。