Невозможно объявить Public static final final String s = new String ("123") внутри внутреннего класса - PullRequest
6 голосов
/ 18 января 2011

Я пытался объявить класс, как показано ниже

class Outer{
    private final class Inner{
      public static final String s1 = new String("123");
      public static final byte[] bytes = new byte[]{0x00, 0x01};

      public static final String s2 = "123";
      public static final byte byte1 = 0x02;
    }
} 

В приведенном выше коде s1 и байты не компилируются, а s2 и byte1 компилируются. Если я помещу всю константную декларацию во внешний класс, она будет работать нормально. чего мне не хватает Любая помощь?

Ответы [ 4 ]

12 голосов
/ 18 января 2011

Читать спецификацию языка Java, 3-е изд, §8.1.3.

Внутренний класс - это вложенный класс, который не является явным или неявным объявлен статическим. Внутренние классы не могут объявлять статические инициализаторы (§8.7) или членские интерфейсы.

Вот почему вы не можете объявить новый public static final String s1 = new String("123");.

Внутренние классы не могут объявлять статические члены, если они не во время компиляции постоянные поля (§15.28).

Это объясняет, почему вы можете сделать public static final String s2 = "123";

Статический вложенный класс может иметь статические члены.

0 голосов
/ 23 апреля 2018

попробуйте это, он прекрасно работает во внутреннем классе:

public static final String  s="123";

Я не знаю причину, почему это разрешено.

0 голосов
/ 18 января 2011

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

8.1.2 Внутренние классы и вложенные экземпляры

Внутренний класс - это вложенный класс, который не является явно или неявно объявленным static.Внутренние классы не могут объявлять статические инициализаторы (§8.7) или интерфейсы-члены.Внутренние классы не могут объявлять статические члены, если они не являются константными полями времени компиляции (§15.28).

0 голосов
/ 18 января 2011

см. Спецификацию языка Java, второе издание, §8.1.2

Внутренний класс - это вложенный класс, который не явно или неявно объявлен статическим. Внутренние классы не могут объявить статические инициализаторы (§8.7) или членские интерфейсы

...