2013-12-12 3 views
1

Я знаю, что это зависит от контекста, в котором был написан анонимный класс (статический или нестационарный метод). но смотреть эту часть кода:Java - Анонимный класс статичен или нет

public class A { 
    int fieldOfA; 

    private static class B { 
     int fieldOfB; 
    } 

    public static void main(String[] args) { 

     B obj = new B() { //this anonymous class is static becuase is in the main method. 

      private static void testMethod() { //so why here i have an error and i can put just a non-static method 
               //if my class is static ? 
               //a class static can have static method, but this class no, why? 
      } 
     }; 
    } 
} 

это убедиться, что анонимный класс статические?

+4

Класс не является статическим, он является локальным для основной функции. Где вы нашли это определение? – Sage

+0

Мы уже провели эту битву около 4 дней назад. –

+0

Статические классы - это те, которые явно помечены ключевым словом «статические». – jdevelop

ответ

3

Анонимный класс является статическим, если контекст статичен. например в статическом методе.

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

В этом примере были созданы два анонимных класса. Один из статических методов не имеет ссылки на внешний класс и как статический вложенный класс.

Примечание: эти классы по-прежнему называются «внутренними» и не могут содержать статические элементы, даже если они не имеют ссылки на класс Outer.

import java.util.Arrays; 

public class Main { 
    Object o = new Object() { 
     { 
      Object m = Main.this; // o has a reference to an outer class. 
     } 
    }; 

    static Object O = new Object() { 
     // no reference to Main.this; 
     // doesn't compile if you use Math.this 
    }; 

    public void nonStaticMethod() { 
     Object o = new Object() { 
      { 
       Object m = Main.this; // o has a reference to an outer class. 
      } 
     }; 
     printFields("Anonymous class in nonStaticMethod", o); 
    } 

    public static void staticMethod() { 
     Object o = new Object() { 
      // no reference to Main.this; 
      // doesn't compile if you use Math.this 
     }; 
     printFields("Anonymous class in staticMethod", o); 
    } 

    private static void printFields(String s, Object o) { 
     System.out.println(s + " has fields " + Arrays.toString(o.getClass().getDeclaredFields())); 
    } 

    public static void main(String... ignored) { 
     printFields("Non static field ", new Main().o); 
     printFields("static field ", Main.O); 
     new Main().nonStaticMethod(); 
     Main.staticMethod(); 
    } 
} 

печатает

Non static field has fields [final Main Main$1.this$0] 
static field has fields [] 
Anonymous class in nonStaticMethod has fields [final Main Main$3.this$0] 
Anonymous class in staticMethod has fields [] 
+1

[Java запрещает модификатор 'static' для всех внутренних классов анонимных классов в любом случае] (http://ideone.com/j2A3aD). – dasblinkenlight

+0

@Peter извините, я не понимаю вашего ответа –

+1

JLS не согласен с этим. –

2

JLS 15.9.5 От:

Анонимный класс всегда внутренний класс (§8.1.3); он никогда не статичен (§8.1.1, §8.5.1).

Раздел 8.1.3 подробно рассказывает о внутренних классах, в том числе о том, когда они происходят в статическом контексте. Но они никогда не статичны сами, и поэтому не могут объявлять статические члены (кроме постоянных переменных).

+0

это я тростник, и почему некоторые люди говорят, что зависит, в каком контексте это анонимный класс? –

+0

@GiovanniFar Я только немного отредактировал свой ответ. Выражения и выражения в анонимном классе могут иметь статический контекст, если анонимный класс объявлен в статическом контексте (см. 8.1.3). Но анонимный класс не статичен. Некоторые люди могут сказать иначе, но они ошибаются, потому что JLS по праву определен. :) – yshavit

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