Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > public static class с не статическими полями


Автор: КунгФуЧайник 29.8.2015, 22:27
Есть public static class. У него есть не статические public поля, методы. Чтобы получить к ним доступ, нужно ведь создать экземпляр этого класса? Смысл тогда объявлять его static-ом?

Автор: AntonSaburov 29.8.2015, 23:20
Это требуется для внутреннего класса - без static доступ к этому классу будет невозможен.

Автор: Wissenstein 30.8.2015, 20:09
Предположим, есть класс
Код

public class Foo {
    pulic static class Bar {
        public String name = "Baz";
    }
}

В этом случае такой код будет правильным:
Код

Foo.Bar fooBar = new Foo.Bar();
String fooBarName = fooBar.name;

Если сделать класс Bar нестатическим:
Код

public class Foo {
    pulic class Bar {
        public String name = "Baz";
    }
}

то предыдущий код доступа к name будет синтаксическии неправильным, и его придётся переписать так:
Код

Foo foo = new Foo();
foo.Bar fooBar = new foo.Bar();
String fooBarName = fooBar.name;


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/public-static-class-s-ne-staticheskimi-polyami-id55e20840ae2015012f8b4567#findElement_E7045_55e338b4ae201527251cbe0c_0

Автор: Samotnik 31.8.2015, 22:14
КунгФуЧайник, вопрос из разряда ту би о но туби smile
Не статический вложенный класс (твой второй) имеет доступ ко всем членам класса, в которые он вложен. В случае со статическим классом, он не имеет доступа к членам и методам того класса, где он лежит.
Попробуй скомпилировать: 
Код

public class Foo {

    private int i =0; //можешь сделать статичной, поможет?

    public static class Bar {
        public String name = "Baz";
        i = 2;
    }

    public static void main(String[] args) {
        Foo.Bar fooBar = new Foo.Bar();
        String fooBarName = fooBar.name;
    }
}


Автор: jelum 12.10.2015, 13:53
@КунгФуЧайник, посмотри на патерн Builder. Он построен через использование внутреннего статичного класса для создание экземпляра внешнего класса. Это одно из применений.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/public-static-class-s-ne-staticheskimi-polyami-id55e20840ae2015012f8b4567#findElement_E7045_561b9122ae2015a719b12d65_0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)