2016-05-19 2 views
5

Я путаюсь с выходом приведенного ниже кода. Я знаю, что первый статический блок запускается после загрузки класса, но почему мой класс Test6 не загружается. Может кто-то прояснить.Почему мой класс не загружается

package com.vikash.General; 

public class Test5 { 

    public static void main(String[] args) { 
     System.out.println(Test6.FOO); 
    } 
    static { 
     System.out.println("Initializing B"); 
    } 
} 
class Test6{ 

    public static final String FOO = "foo"; 
    static { 
     System.out.println("Initializing A"); 
    } 
} 
+0

Я получаю o/p Инициализация B foo –

ответ

0

Используйте загрузчик класса вы получите требуемый выход

Class.forName("<package>.Test6"); 
+0

Почему бы не просто «Класс foo = Test6.class'? – Thilo

+1

все будет работать. Я просто дал это, поскольку OP был смущен проблемой загрузки классов. – Helios

+0

Не совсем. Выражение типа 'System.out.println (Test6.FOO)' обычно также загружает класс (но не в этом случае). – Thilo

2

Казалось бы, потому что компилятор встраивание ссылку на строковый литерал "foo", поэтому JRE фактически не беспокоить загрузки Test6, чтобы получить его.

Если вы вносите изменения, такие как:

public static final String FOO = new String("foo"); 

то класс Test6 действительно загружаются (и его static блок запускается на выполнение).

+0

Он также работает с буквальным, когда 'FOO' не является окончательным. Но в случае, если это так, ваше решение работает. – Clayn

9

Test6.FOO относится к Test6, но поле является public static final String инициализируется из компиляции постоянная времени, так что will be inlined by the compiler и Test6 не должен быть загружено на всех.

+0

Действительно. При удалении 'final' будет вызван статический инициализатор – Clayn

+0

@Thilo Можете ли вы объяснить,« он будет встроен компилятором ». Я не могу понять. Это ново для меня – mubeen

+1

Фактически, код становится 'System.out.println (" foo ")'. Компилятор заменяет ссылку на поле литералом String. Во время выполнения 'Test6' не требуется для этой строки кода. – Thilo

-3

Test6 не инициализирован вообще.

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

+3

Я не знаю, понимаю ли я этот ответ полностью, но я уверен, что он ошибается и не отвечает на вопрос. – SomeJavaGuy

+0

Если вы не понимаете, почему вы так уверены, что это неправильно? – sotondolphin

+0

, потому что он не объясняет, почему 'Test6' не загружается. Это просто связано с запутанным объяснением «foo is static», которое на данный момент не связано с поведением. На самом деле это вопрос, несмотря на 'foo' beeing' static', почему он не загружает «Test6» и, следовательно, вызывает «статический блок инициализатора» – SomeJavaGuy