Можем ли мы не получить доступ к анонимным членам данных класса, если они не объявлены в родительском классе?

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 вне анонимного класса, если он не объявлен в родительском классе?

Можем ли мы объявить те поля и методы, которые существуют в родительском классе, только ради перегрузки, скрытия и переопределения в анонимном классе?

1. Как видите, нет, вы не можете получить доступ к y извне. 2. Как видите, компилятор позволяет вам объявить y, а y ничего не перегружает, не переопределяет и не скрывает.

JB Nizet 04.11.2018 14:58

@JBNizet: Просто любопытно, раз уж мы создали объект p, разве мы не должны иметь доступ к y, используя этот объект?

Nicholas K 04.11.2018 14:59

Нет, поскольку объявленный тип переменной - Parent, а Parent не имеет поля-члена с именем y. Это не ограничивается анонимными классами. Если вы используете Object p = new Point(1, 2), вы не можете использовать p.x и p.y, потому что объявленный тип переменной p - это Object, а не Point.

JB Nizet 04.11.2018 15:01

Спасибо. Но просто подумал, поскольку мы создаем объект самого Parent (через анонимный класс), я почувствовал, что к нему можно получить доступ.

Nicholas K 04.11.2018 15:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
29
1

Ответы 1

Код Анонимный остается анонимный, если он не назначен, также смотрите на него как на простой блок, так как для блока инициализации вы не ожидаете получить значение снаружи:

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;
  }

Другие вопросы по теме