Вопрос по static, java, inner-classes, non-static, static-members – Почему нестатический внутренний класс не может иметь статических членов (полей и методов)? [Дубликат]

9

Possible Duplicate:
Why cant we have static method in an inner class?

Я знаю, что создание нестатического объекта внутреннего класса требует объекта внешнего класса, а созданный нестатический объект внутреннего класса автоматически имеет скрытую ссылку на объект внешнего класса. Но почему в нестатическом внутреннем классе не может быть статических членов? Разработчику Java просто нужно запретить доступ к нестатическим полям внешнего класса внутри статического метода внутреннего класса, это было бы более логично, не так ли?

Если не имеет смысла иметь статические члены во внутреннем классе, почему внутренний класс может наследовать статические члены, наследуя класс, имеющий статические члены?

Я читаю этосообщение тоже. Как уже упоминалось:

Inner classes may inherit static members that are not compile-time constants even though they may not declare them. Nested classes that are not inner classes may declare static members freely, in accordance with the usual rules of the Java programming language.

Это соглашение?

Вот мой код:

public class OuterClass {

    private int outerClassField;

    public void doSomethingOuterClass() {
        outerClassField = 1;
    }

    public static void doSomethingStaticOuterClass() {
        // outerClassField = 2; // Error: Because static method cannot access an specific object's field
    }

    public class InnerClass extends ClassWithStaticField {

        // Error: Why a non-static inner class cannot have static fields ?
        // public static int innerClassStaticField = 1;

        public void doSomethingInnerClass() {
            outerClassField = 3;
            staticField = 1;
        }

        // Error: Why a non-static inner class cannot have static methods ?
        // public static void doSomethingStaticInnerClass() {
        // outerClassField = 4;
        // }
    }

    public static void main(final String[] args) {
        // If it does not make sense to have static members in an inner class, why inner class can inherit statis members by inheriting a class who has static
        // members?
        OuterClass.InnerClass.staticField = 1;
        OuterClass.InnerClass.staticMethod();
    }
}

class ClassWithStaticField {
    public static int staticField;

    public static void staticMethod() {
    };
}
Смотрите также :stackoverflow.com/questions/2482327/… Autar

Ваш Ответ

3   ответа
8

почему язык ограничивает использование статических элементов для внутренних классов. Нестатический внутренний класс можно эмулировать, используя обычный класс, который принимает (ранее) включающий экземпляр в качестве аргумента для конструктора. Конечно, есть много небольших различий, когда дело доходит до правил видимости и областей видимости.

Я предполагаю, что это было решение о разработке языка, главным образом потому, что статика в нестатических внутренних классах сбивает с толку и не интуитивно понятна для доступа (Outer.Inner.StaticMember).

15

1. object изNon-static inner class связано сinstance/object егоOuter Class (т.е. включающий класс).

2. entire body of a Non-static inner class являетсяNot within a static scopeи, следовательно, выcan't have static members in there.

3. Instance variables а такжеmethods вnon-static inner class являютсяrelative to an instance of the enclosing classтак, будучи связанным с объектом,static won't hold true for them (т.е. внутренний класс),

4.  Когда мы создаемInstance изnon-static inner classмыNeed Object of Outer enclosing class,innernon-static class имеетimplicit reference к этомуouter enclosing class.

Eg:

Outer o = new Outer();
Outer.Inner i = o.new Inner();
статические константы времени компиляции не являются статическими членами. Они, как следует из названия, являются константами и, следовательно, остаются одинаковыми во всех случаях включения класса и, следовательно, вероятно, разрешены.
Интересно, что вы можете использовать static final вместе во внутреннем классе.
Относительно пункта 2: Статические постоянные поля времени компиляцииare разрешено внутри классов
1

еннего класса. Вы могли бы использовать нестатический метод внутри внешнего класса?

«Нет смысла» не является ответом, а также не затрагивает проблему данных членов в дополнение к методам.

Похожие вопросы