2013-07-10 2 views
1

У меня есть несколько вопросов о статической в ​​Javaможем ли мы иметь статический блок в нестационарном классе в java?

  1. Можем ли мы иметь статический блок в странах, не статический класс ?? Если объект что (не статический) класс инициализируется в другом классе, будет статический блок выполняется тогда?

  2. Если есть статический класс, имеющий статический блок и переменную (интермедиат а = 3) и основной() метод, и он выполняется тогда переменная инициализация пройдет первый или выполнение статического блока? Я знаю что статический блок выполняется перед методом main().

+2

Да, мы можем иметь статический блок в нестационарном классе. Что вы еще пробовали? –

+0

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

+0

Когда вы говорите статический класс, вы имеете в виду статический внутренний класс? Потому что в противном случае нет статических классов. –

ответ

4

1) Нет, вы не можете, попробуйте это

class Test1 { 

    class X { 
     static { <-- compile error: Cannot define static initializer in inner type Test1.X 
     } 
    } 
... 

X должен быть статическим.

Примечание: Я предполагаю, что мы говорим о вложенных классах, потому что это, где статический модификатор применим для классов

2) это зависит, посмотреть

class Test1 { 
    static { 
     x = 3; 
    } 

    static int x = 2; 

    public static void main(String[] args) throws Exception { 
     System.out.println(x); 
    } 
} 

выход

2 

, но сейчас

class Test1 { 
    static int x = 2; 

    static { 
     x = 3; 
    } 

    public static void main(String[] args) throws Exception { 
     System.out.println(x); 
    } 
} 

выхода будет

3 

Статическая инициализация выполняется только те, во время загрузки класса, это происходит всегда перед любым экземпляром конкретизации.Интересно, как инициализация статических полей и статического кода инициализации блок работает в одной и той же функции байт-кода с именем <clinit>:

static <clinit>()V 
    L0 
    LINENUMBER 12 L0 
    ICONST_3 
    PUTSTATIC test/Test1.x : I 
    L1 
    LINENUMBER 15 L1 
    ICONST_2 
    PUTSTATIC test/Test1.x : I 
    RETURN 
+0

OHkay..это то, что я имел в виду под статическим блоком ... вот ответ на вопрос 1. что о 2 ?? – Smatik

+0

@ Сматик - Почему вы не тратите 2 секунды на создание тестовой программы, которая ответит на вопрос №2? – jahroy

+0

ОК, см. Мое обновление –

3

Пожалуйста, смотрите здесь http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

Это называется static initializer in the spec. Этот код будет выполнен, когда JVM загрузит класс. Система времени выполнения гарантирует, что статические блоки инициализации вызываются в порядке их появления в исходном коде.

Вы не можете использовать статический код нестатических внутренних классов:

public class MyClass { 

    static { 
     System.out.println("static code from nonstatic class"); 
    } 

    class In { 
     /* it will not compile 
     static { 

     } 
     */ 
    } 
    static class In2 { 
     static { 
     System.out.println("static code from static inner class"); 
     } 
    } 
    public static void main(String[] args) { 
     MyClass c = new MyClass(); 
    } 
} 

См Detailed Initialization Procedure в The Java® Language Specification для получения подробной информации о вызове заказа. Просто статические блоки выполняются в том порядке, в котором они появляются в исходном коде.

1

Наличие статического класса по сравнению с обычным классом не влияет на конструкцию программирования, которую вы разрешили использовать, но просто контролирует, имеет ли класс доступ к полям/методам окружения окружающего класса.

+0

Это неправда. То есть вы не можете использовать статический код в нестатических внутренних классах. – zacheusz

0

Да, мы можем иметь статический блок в non-static классе и он будет загружен как только класса нагрузок в JVM

public class StaticDemo { 

    static{ 
     System.out.println("already loaded"); 
    } 

    public static void main(String [] args){ 

    } 

} 

Это выводит already loaded

+0

Спасибо .. я думаю, что мы не можем объявить статический блок во внутренних классах ... – Smatik

1

на вопрос 2, ответ может быть найден в Java Language Specification §12.4.2, в частности, шаг 9 «подробное описание процедуры инициализации ":

Далее выполните [...] инициализаторы переменной класса и статические инициализаторы класса [...] в текстовом порядке, как если бы они были одним блоком.

Других слов, static {} блоков и инициализатор выражение статических полей выполняются в порядке их появления в исходном коде - если статический блок перед объявлением поля, то он будет работать первый (и увидеть значение по умолчанию для поля, обычно null или 0), если статический блок после объявления поля, он будет работать вторым (и будет видеть значение, назначенное выражением инициализатора).

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