Проще говоря, это потому, что Java не позволяет этого, в то время как есть языки, которые делают (например, Python). В Java вы не можете monkey-patch существующий код.
Почему? Ну, Java не была рождена как функциональный язык, поэтому, хотя в Java 8 было добавлено большое количество ссылок на функции, они все еще не первоклассные граждане. Таким образом, вы не можете присвоить новое значение методу класса, как вы можете с полем этого класса.
Однако, поскольку вы можете присваивать значения полям, вы можете сделать что-то вроде этого:
class TestClass3 {
public Supplier<TestClass3> hello;
public TestClass3() {
this.hello = this::hello;
}
public TestClass3 hello() {
TestClass3 t = new TestClass3();
return t;
}
}
class TestClass1 {
public static void main(String[] args) {
TestClass3 obj = new TestClass3();
obj.hello.get(); // calls hello()
obj.hello = null; // now works
}
}
Здесь я определяю члена с именем hello
в TestClass3
. Это тип Supplier<TestClass3>
, и так уж получилось, что public TestClass3 hello()
того же типа. Следовательно, в конструкторе TestClass3
я могу сделать это: this.hello = this::hello;
.
Теперь у нас есть ссылка на hello()
как поле , что означает, что мы можем вызватьиспользовать это поле или даже изменить значение поля:
obj.hello.get();
obj.hello = null;