7
爲什麼我們可以有靜態最終成員,但不能在非靜態內部類中使用靜態方法?爲什麼我們可以有靜態最終成員,但不能在內部類中使用靜態方法?
我們可以在沒有實例化內部類的情況下訪問外部類之外的內部類的靜態最終成員變量嗎?
爲什麼我們可以有靜態最終成員,但不能在非靜態內部類中使用靜態方法?爲什麼我們可以有靜態最終成員,但不能在內部類中使用靜態方法?
我們可以在沒有實例化內部類的情況下訪問外部類之外的內部類的靜態最終成員變量嗎?
你可以在靜態方法靜態「內部」類。
public class Outer {
static String world() {
return "world!";
}
static class Inner {
static String helloWorld() {
return "Hello " + Outer.world();
}
}
public static void main(String args[]) {
System.out.println(Outer.Inner.helloWorld());
// prints "Hello world!"
}
}
爲了精確,但是,Inner
根據JLS術語(8.1.3)稱爲嵌套類:
內部類可以繼承未編譯的時間常數,即使它們可能靜態成員不宣佈他們。根據Java編程語言的通常規則,不是內部類的嵌套類可以自由地聲明靜態成員。
此外,它不完全正確的,一個內部類可以有static final
成員;更準確地說,它們也必須是編譯時常量。下面的例子說明了區別:他們是在編譯時內聯:
public class InnerStaticFinal {
class InnerWithConstant {
static final int n = 0;
// OKAY! Compile-time constant!
}
class InnerWithNotConstant {
static final Integer n = 0;
// DOESN'T COMPILE! Not a constant!
}
}
爲什麼編譯時常被允許在這方面是很明顯的原因。
編譯時內聯是一個實現細節。更重要的是,在代碼可能合法使用的情況下,用常量加載的最終靜態字段的行爲與用相同常量加載的靜態實例字段的行爲不可區分。非靜態內部類的靜態成員的適當行爲將是模糊的,但對於用常量加載的靜態最終字段,解決歧義性的兩種可能方式都會產生相同的結果。 – supercat 2014-03-18 20:29:16