2013-07-26 11 views
9

W jaki sposób statyczna wewnętrzna klasa M i statyczny element członkowski M [klasy] mają tę samą nazwę?Statyczna klasa wewnętrzna i statyczny członek klasy akcji SAME NAME?

Poniższy kod generuje „białe” jako wyjście:

public class Amazed{ 

    public static void main(String[] args) { 
     System.out.println(B.M.W); 
    } 
} 

class B { 
    public static class M {  
     static String W = "Black"; 
    } 

    static C M = new C(); 
} 

class C { 
    String W = "White"; 
} 

jak obiekt członek jest dostępne, a nie statyczne członek klasa: W [ „czarny”]

jeśli chcę uzyskać dostęp do członek klasy statycznej M jak to zrobić?

+1

Podoba mi się metoda "meth", która nie prowadzi cię nigdzie. Jednak bardzo długa pętla może być bardziej odpowiednia. – thatidiotguy

+0

@ thatidiotguy: Lub coś, co się powtarza, dopóki nie rozwali stosu. –

+0

Dzięki BMT. Ale nie rozumiem specyfikacji ukrywania i reklasyfikacji ... Czy ktoś może mi w tym pomóc? – Dineshkumar

Odpowiedz

2

Chapter 6 of the Java Language Specification (zwłaszcza Section 6.5) literuje makabryczne szczegóły jak Java sortuje się, co oznacza konkretny identyfikator w określonym kontekście. Zasady są dość skomplikowane, ale z grubsza rzecz biorąc, Java ma sześć obowiązuje nazwa:

  • nazw pakietów
  • nazwy typu
  • Field (zmienne) Nazwy
  • metoda nazwy
  • nazw zmiennych lokalnych (w tym parametry)
  • etykiety

Ten sam identyfikator może być u sed dla jednostek w każdej z tych przestrzeni nazw. Zwróć uwagę, że nazwy typów i klas są osobno, co wyjaśnia, dlaczego Twój kod jest legalny.

Odziedziczone nazwy w tej samej przestrzeni nazw mogą być czasami zacienione lub zamaskowane. Czasami identyfikator jest niejednoznaczny; to musi być w jakiś sposób zakwalifikowane (np., z nazwą pakietu) lub kompilator będzie narzekał.

obfuscators Code to wykorzystać do wielkiej przewagi, do punktu, gdzie można skończyć z pakietu o nazwie a.a i klasy o nazwie a w pakiecie a (które również byłyby zidentyfikowane jako a.a). Nie wspominając, że słowa kluczowe Java, takie jak do i for, są prawnymi nazwami w plikach .class (ale nie w źródle Java). Pomaga uczynić inżynierię odwrotną prawdziwym niedźwiedziem.

0

W danym przypadku M może być instancja można wykorzystać fakt, że statyka mogą być dostępne w non-statycznego sposób:

public class Amazed{ 
    @SuppressWarnings("static-access") 
    public static void main(String[] args) { 
     B.M val = new B.M(); 
     System.out.println(val.W); 
    } 
} 

class B { 
    public static class M {  
     static String W = "Black"; 
    } 

    static C M = new C(); 
} 

class C { 
    String W = "White"; 
} 

Powyższy będzie drukować „czarne”, ponieważ ujednoznacznione identyfikator przez odnosząc się do niego poprzez instancję B.M. W żaden sposób nie jest to dobry pomysł w kodzie produkcyjnym, oczywiście, ponieważ statyczne pola nie powinny być dostępne w sposób nie statyczny. Podobnie wymaga utworzenia instancji B.M.

1

Zmienna ukrywa typ o tej samej nazwie. Jeśli nazwa może być interpretowana jako zmienna lub typ, preferowana jest zmienna.

Można tego uniknąć, nie nadając im tej samej nazwy.

Z języka Java Specification, section 6.4.2: Obscuring:

6.4.2. Obscurowanie:

Prosta nazwa może występować w kontekstach, w których potencjalnie może być interpretowana jako nazwa zmiennej, typu lub pakietu. W takich sytuacjach zasady zawarte w §6.5 określają, że zmienna zostanie wybrana jako preferowana względem typu, a rodzaj zostanie wybrany jako preferowany względem pakietu. Dlatego czasem może być niemożliwe odwołanie się do widocznego typu lub deklaracji paczki za pomocą jej prostej nazwy. Mówimy, że taka deklaracja jest zasłonięta.

+0

jak jest wybrany? jaka jest kolejność preferencji? – Dineshkumar

+1

1) Zmienna 2) Typ 3) Nazwa pakietu –

+0

Czy Typ oznacza tutaj coś innego niż klasa? – Dineshkumar

0

Po wszystkim pomocy i małej zabawie okazało się, że nawet bez tworzenia obiektu dla wewnętrznej klasy możemy uzyskać dostęp do członka W "Czarnego".

prostu za to stwierdzenie

M.W 

ale nie mogę dowiedzieć się, poziom dostępu. [ponieważ jego publiczność?] nawet bez publiczności zadziałało. jak to?