2016-09-16 20 views
5
public class InstanceBuilder { 

    private static final InstanceBuilder INSTANCE = new InstanceBuilder(); 

    private static String name = null; 

    private InstanceBuilder() { 
     System.out.println("Setting cons()"); 
     name = "Testing"; 
    } 

    public static String getName() { 
     return name; 
    } 
} 

public class Driver { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     System.out.println("value is " + InstanceBuilder.getName()); 
    } 

} 

wyjściowa:Zrozumienie statyczna zmienna inicjalizacji w Javie

Setting cons() 
value is null 

Dlaczego to wartość wydruku jako null chociaż mam ustawić zmienną w konstruktorze static i nazywa się zgodnie z oczekiwaniami. Jeśli próbuję drukować w konstruktorze, to drukuje on kod Testing, ale jeśli zadzwonię z metody public static, jest to null. Wiem, że jeśli zmienię to na INSTANCE.name, to działa. Ale chcę zrozumieć, dlaczego nie działa, jeśli mam bezpośredni dostęp do zmiennej static, ponieważ ta sama kopia powinna być udostępniona. Czego mi tu brakuje?

Odpowiedz

8

Ponieważ wartość nazwy jest modyfikowana po wywołaniu konstruktora zgodnie z kolejnością deklaracji.

Pozwala zobaczyć, co się dzieje:

1) Po wywołaniu InstanceBuilder.getName(), InstanceBuilder klasa jest coraz załadowany. W ramach tego procesu inicjowane są zmienne instancji INSTANCE i name.

2) Podczas inicjalizacji INSTANCE,

private static final InstanceBuilder INSTANCE = new InstanceBuilder(); 

konstruktor InstanceBuilder klasa jest uzyskiwanie wywołana & Setting cons() oświadczenie jest coraz drukowane i name zmienna jest inicjowana z Testing.

3) Następnie name znowu zaczyna ponownie zainicjowany z null ze względu na poniższym oświadczeniem

private static String name = null;

więc kiedy wraca wywołanie metody do Driver klasy wartość name jest nullnull i drukowany jest coraz. Mimo, że name jest zadeklarowany jako static, statyczne nie ma żadnej roli w tym kontekście.

Uwaga:

zobacz link poniżej na zlecenie której członkowie klasy należy deklarowanej

http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-141855.html#1852

+0

Dzięki za wyjaśnienie wątpliwości – Kars

0

Tutaj wartość jest zerowa, ponieważ inicjalizacja statyczna występuje jako jej oświadczyć na zamówienie, Najpierw należy więc najpierw podłączyć swój telefon do innej firmy. de wykonać i przypisać wartość do „testowania”, a następnie kod

`private static String name = null;` 

exceute i przesłanianie wartość null (jako zmiennej statycznej mają Coppy za jedyną klasą), więc końcowa wartość będzie zerowa.

Więc tutaj to zachowanie jest tylko ze wzgl? Du kolejności wykonywania statycznych zmiennych

+0

Dzięki, rozumiem gdzie myliłem z wyjaśnieniu. – Kars

Powiązane problemy