2016-12-07 2 views
3

Я новичок в java. В настоящее время я читаю статьи о статических переменных. Когда я пытаюсь реализовать свои знания, я столкнулся с проблемой статических переменных. Вот первый пример кода.Объявление статической переменной в нестатическом классе в Java

public class Human { 
    // in Human.java 
    public static int population = 0; 
    public static void main(String[] argv) { 
     System.out.println(population); 
    } 
} 

Этот код работает отлично, и результат равен 0. Но на следующий код, я не позволяю скомпилировать.

public class Human { 
    // in Human.java 
    public class Charlie extends Human { 
     public static int number = 0; 
    } 

    public static void main(String[] argv) { 
     System.out.println(new Human().new Charlie().number); 
    } 
} 

Ошибка: Число поля не может быть объявлено статическим в нестатическом внутреннем типе, если не инициализировано с постоянным выражением

Я путать с этой ситуацией. Для первого примера кода мой класс Human не статичен, и мне было разрешено объявлять в нем статическую переменную. Почему я не могу сделать то же самое для своего второго образца кода.

Любая помощь будет оценена по достоинству. Благодарю. :)

ответ

4

Попробуйте с public static final int number = 0;, потому что Java не позволяет вам определять не конечные статические поля внутри функционально-локальных внутренних классов. Только классы верхнего уровня и статические вложенные классы могут иметь не конечные статические поля.

От JLS section 8.1.3:

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

Другой способ сделать внутренний класс статический и доступ к нему

public class Human { 
    // in Human.java 
    public static class Charlie extends Human { 
     public static int number = 0; 
    } 

    public static void main(String[] argv) { 
     System.out.println(new Human.Charlie().number); 
    } 
} 
+0

другой путь будет сделать класс чарли статичным. возможно, стоит упомянуть – Aelop

+0

Я вижу. Есть ли какие-либо причины для Java, чтобы иметь это ограничение? Означает ли это, что Java VM рассматривает внутренний класс, отличный от внешнего класса? – FunnyFunkyBuggy

+0

@ Aelop Right .. Я только что обновил свой ответ. – iMBMT

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