2013-09-16 3 views
0

Почему не этот код работаетДоступ к частной переменной экземпляра внутреннего класса из внешнего класса

public class BB 
{ 
    private class A 
    { 
     private int x; 
    } 

    public static void main(String[] args) 
    { 
     A a = new A(); 
     a.x = 100; 
     System.out.println(a.x); 
    } 
} 

в то время как этот код работает?

public class BB 
{ 
    private class A 
    { 
     private int x; 
    } 

    static int y = 3; 

    public static void main(String[] args) 
    { 
     BB b = new BB(); 
     b.compile(); 
     System.out.println("y = "+ y); 
    } 
    public void compile() 
    { 
     A a = new A(); 
     a.x = 100; 
     System.out.println(a.x); 
     System.out.println("y = "+ y); 
    } 
} 

В первом коде, когда я пытаюсь обратиться к переменному экземпляру «х» внутреннего класса «А» на объект внутреннего класса «а», я получаю сообщение об ошибке сказав, что я использую внутренний класс в статическом контексте. Ошибка при выполнении одного и того же метода.

+0

Во втором коде, вы не имеет доступа к внутренним классом в статическом контексте: вы к нему доступ из метода класса 'bb'. Вот почему вы не получаете эту ошибку. – RaptorDotCpp

+1

try 'BB b = new BB(); \t A a = b.new A(); ' –

+0

Ваш вложенный класс также должен быть статическим. –

ответ

10

Ваша ошибка не имеет ничего общего с доступом к полю. Компиляция не выполняется для этой линии:

A a = new A(); 

Причина: Вы не можете создать экземпляр внутреннего класса без ограждающих например, что это именно то, что строка кода пытается сделать. Вместо этого вы можете написать

A a = (new BB()).new A(); 

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

В качестве альтернативы просто введите A класс static, что означает, что у него нет прилагаемого экземпляра.

0

частный класс A подобен члену экземпляра, и мы не можем использовать экземпляр внутри статического метода без создания его объекта. Поэтому сначала нам нужно создать объект внешнего класса, чем мы можем использовать внутренний класс экземпляра. И ниже код работает нормально.

класс BB { частный класс А { частное ИНТ х; }

public static void main(String[] args) 
{ 
    BB bb = new BB(); 
    BB.A a = bb.new A(); 
    a.x = 100; 
    System.out.println(a.x); 
} 

}

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