Объявление метода при создании объекта
Почему первый путь верен, а второй нет?
Первый способ:
new Object() {
public void a() {
/*code*/
}
}.a();
Второй способ:
Object object = new Object() {
public void a() {
/*code*/
}
};
object.a();
И где я могу найти больше информации об этом?
Ответы
Ответ 1
java.lang.Object
не имеет метод, объявленные (2), в то время как анонимный класс возвращаемого a
экземпляр класса выражение создания new Object() { public void a() {} }
делает (1).
Используйте вывод типа локальной переменной Java 10 (var
), чтобы сделать второй параметр таким же допустимым, как и первый.
var object = new Object() {
public void a() {}
};
object.a();
Ответ 2
Во втором варианте вы назначаете свой новый объект для ссылки типа Object
. Из-за этого только ссылки, определенные в java.lang.Object
могут быть вызваны по этой ссылке.
И в первом варианте вы в основном создаете новый объект анонимного класса, который расширяет java.lang.Object
. Этот анонимный класс имеет дополнительный метод a()
, поэтому вы можете вызывать его.
Ответ 3
Ява статически типизирована. Когда вы говорите 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);
Это напечатало бы
В
Ответ 4
Не волнуйтесь, вам придется внести некоторые исправления. Оба способа доступа к закрытому члену класса. Используя первый способ, вам не нужно предварительно объявлять 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();
}
}
Надеюсь, это немного поможет.