2015-11-18 3 views
-1

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

Может ли кто-нибудь помочь мне понять это.

public class Main { 
    public static void main(String[] args) { 
     System.out.println(X.Y.Z); // prints 'White' 
    } 
} 

class X { 
    static class Y { 
     static String Z = "Black"; 
    } 

    static C Y = new C(); 
} 

class C { 
    String Z = "White"; 
} 
+3

Заявления 'статический CY = новый C();' вызывает код для печати из «белого» вместо «черного» потому что это переопределяет статический член Y класса X. Кроме того, это ужасный код. Это очень непроницаемо. – sengbatz

+1

@SkinnyJ Мне нравится, как это точно такой же вопрос только с классом 'C' вместо' W' и другими строками – SomeJavaGuy

ответ

3

Вы создали имя, которое masks статический класс Y (типа C). Чтобы получить black, вам нужно будет получить доступ к классу Y. Вы можете сделать это, как,

System.out.println(new X.Y().Z); //<-- prints black 

или переименовать поле маскирующего

static C Z = new C(); // <-- from Y. 
Смежные вопросы