class Parent{
String h;
Parent(String s){
h = s;
}
}
public class Child{
public static void main(String args[]){
Parent p = new Parent("fcghj"){ // anonymous class
private int y = 9;
};
System.out.println(p.h);
System.out.println(p.y); // error
}
}
Отображается ошибка: не удается найти символ y в родительском элементе
Есть ли способ получить доступ к y вне анонимного класса, если он не объявлен в родительском классе?
Можем ли мы объявить те поля и методы, которые существуют в родительском классе, только ради перегрузки, скрытия и переопределения в анонимном классе?
@JBNizet: Просто любопытно, раз уж мы создали объект p, разве мы не должны иметь доступ к y, используя этот объект?
Нет, поскольку объявленный тип переменной - Parent, а Parent не имеет поля-члена с именем y. Это не ограничивается анонимными классами. Если вы используете Object p = new Point(1, 2), вы не можете использовать p.x и p.y, потому что объявленный тип переменной p - это Object, а не Point.
Спасибо. Но просто подумал, поскольку мы создаем объект самого Parent (через анонимный класс), я почувствовал, что к нему можно получить доступ.




Код Анонимный остается анонимный, если он не назначен, также смотрите на него как на простой блок, так как для блока инициализации вы не ожидаете получить значение снаружи:
public class Child {
{ // initialize block
int y = 9;
}
public static void main(String args[]){
Parent p = new Parent("fcghj");
System.out.println(p.h);
System.out.println(y); // error
}
Вы можете изменить / добавить родительский конструктор с параметром int, чтобы использовать его позже
class Parent{
String h;
int y;
Parent(String s, int y){
h = s;
this.y = y;
}
1. Как видите, нет, вы не можете получить доступ к y извне. 2. Как видите, компилятор позволяет вам объявить y, а y ничего не перегружает, не переопределяет и не скрывает.