2015-06-19 2 views
3

Почему внутренние классы не имеют статических (нефинальных) полей и методов?Внутренние классы Java и статические методы или поля

Этот вопрос был опубликован раньше, но опубликованные ответы были: это дизайнерское решение или потому что внутренние классы происходят в контексте внешнего класса и не могут объявлять статические методы.

Однако эти ответы не уточняют мой вопрос. Каковы были бы последствия использования статических полей и методов для внутренних классов? Я предполагаю, что оба ограничения связаны. Поскольку для статических методов потребуется доступ к другим статическим методам и не конечным статическим переменным внутреннего класса или даже из внешнего класса (чтобы иметь возможность изменять внутренние состояния), это приведет к тому, что внутренний класс будет вести себя как статический. Однако JVM может ограничить доступ со статических методов во внутренних классах к статическим методам и данным внутри внутреннего класса. Однако возникает вопрос: почему мы не можем объявлять статические не конечные переменные внутри внутренних классов?

Этот дизайн или есть проблемы?

Сердечных приветы

+2

Основная проблема заключается в том, что это не имеет смысла. Внутренний класс по своей сути не является статичным; он привязан к экземпляру внешнего класса. Становление методов во внутреннем классе просто бессмысленно. –

+2

Вы можете объявлять статические члены внутри внутреннего класса. Класс просто должен быть статическим внутренним классом. –

+0

@BalkrishnaRawool OP спрашивает о внутренних классах (нестатические вложенные классы). – Pshemo

ответ

0

Объявления статических переменных в нестатическом внутреннем классе кажется противоречивым намереваться созданием внутреннего нестатического класса.
Если вы объявляете некоторые переменные и методы static, вы делаете это, когда имеет смысл обращаться к ним, не создавая экземпляр класса, если вы объявляете внутренний класс нестатическим своим типом экземпляра, так что намерение - это получить доступ к нему через свой экземпляр не статически. Если вы объявляете внутренний класс static, поэтому отделяйте его от внешнего класса, вы можете объявлять переменные и методы статическими.
Вы спросили, что будет последствиями, если java разрешит вам объявлять статические методы/поля во внутренних нестатических классах. Ну, вероятно, их не будет. Но это просто не имеет смысла, поэтому это выбор дизайна.

+0

Не совсем. Что делать, если у вас есть внешний класс «Человек» и внутренний класс «Сердце». Предположим, что есть два поля для Сердца: static isPumping (для установки поведения по умолчанию для встроенных сердец) и hasStroke (зависит от сердца).Внутренний класс не допустил бы, чтобы isPumping был изменен, а статический вложенный класс заставил Сердце ассоциироваться с классом Human (не предназначен). Что я делаю? (быстрый пример) – BrunoMCBraga

+0

Да, но поблем с внутренним классом заключается в том, что он должен быть доступен через внешний. Outer.Inner.variable/метод. Поэтому, если внутренний нестатический, вы можете получить доступ к нему через Outer outer = new Outer(); outer.Inner.method/переменная. Достойная, но противная. Вот почему это, вероятно, не допустимо. –

+1

"* Таким образом, если внутреннее нестатическое значение, вы можете получить доступ к нему через« Outer outer = new Outer(); external.Inner.method/variable'. * », Что не обязательно true. Внутренние классы могут иметь статические поля, если они являются константами времени компиляции, и мы можем получить к ним доступ через 'Outer.Inner.compileTimeConstant' (не требуется внешний экземпляр). Демо-версия http://ideone.com/wGeErO. – Pshemo

Смежные вопросы