Почему у нас могут быть статические конечные члены, но не может быть статического метода во внутреннем классе? - PullRequest
7 голосов
/ 20 марта 2010

Почему у нас могут быть статические конечные члены, но не может быть статического метода в нестатическом внутреннем классе?

Можем ли мы получить доступ к статическим переменным конечного члена внутреннего класса вне внешнего класса без создания экземпляра внутреннего класса?

1 Ответ

7 голосов
/ 20 марта 2010

ВЫ МОЖЕТЕ иметь статический метод в статическом"внутреннем" классе.

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!
    }
}

Причина, по которой константы времени компиляции допускаются в этом контексте, очевидна: они встроены во время компиляции.

...