Объявление метода при создании объекта - PullRequest
0 голосов
/ 28 декабря 2018

Почему первый способ верен, а второй нет?


Первый способ:

new Object() {
    public void a() {
        /*code*/
    }
}.a();

Второй способ:

Object object = new Object() {
    public void a() {
        /*code*/
    }
};

object.a();

А где я могу найти больше информации об этом?

Ответы [ 4 ]

0 голосов
/ 30 декабря 2018

Не волнуйтесь, вам придется внести небольшую поправку. Оба способа доступа к закрытому члену класса.Используя первый способ, вам не нужно предварительно объявлять method.ex: -

public class demo {

    public static void main(String[] args) {
    new Object() {
        public void a() {
            /*code*/
            System.out.println("Hello");
        }
    }.a();

}

}

Но используя второй способ, вам придется явно объявить метод a ();либо в абстрактном классе, либо в интерфейсе, вы можете переопределить его.как: -

interface Object
{
public void a();
}
class demo {

public static void main(String[] args) {
    Object object = new Object() {
        public void a() {
            System.out.println("Hello");
        }

    }; object.a();


}

}

Надеюсь, это немного поможет.

0 голосов
/ 28 декабря 2018

java.lang.Object не имеет объявленных методов a (2), в то время как анонимный класс, возвращаемый выражением создания экземпляра класса new Object() { public void a() {} }, делает (1).

Используйте Java 10 вывод типа локальной переменной (var), чтобы сделать второй параметр таким же допустимым, как и первый.

var object = new Object() {
    public void a() {}
};
object.a();
0 голосов
/ 28 декабря 2018

Java статически типизирована.Когда вы говорите object.a(), он ищет метод a в классе Object, которого нет.Следовательно, он не компилируется.

Что вы можете сделать, это получить метод object, используя отражение, как показано ниже:

Object object = new Object() {
  public void a() {
     System.out.println("In a");
  }
}

Method method = object.getClass().getDeclaredMethod("a");
method.invoke(object, null);

Это вывело бы

В

0 голосов
/ 28 декабря 2018

Во втором варианте вы назначаете свой новый объект для ссылки типа Object.По этой причине для этой ссылки можно вызывать только методы, определенные в java.lang.Object.

И в первом варианте вы в основном создаете новый объект анонимного класса, который расширяет java.lang.Object.Этот анонимный класс имеет дополнительный метод a(), поэтому вы можете вызывать его.

...