Возможно ли в Java добавление экземпляру класса метода непрописанного в классе?
Например:
Есть класс HumanHero и его экземпляр Hercules.
Изначально наш герой не может летать, но вот, случается чудо и, по стечению обстоятельств и личному благоволению Зевса, наш герой отращивает себе крылья и получает данную способность.
Вопрос:
Есть ли возможность добавить экземпляру класса HumanHero метод fLy(), если при создании класса, данный метод там не был прописан?
Вы не совсем верно представляете себе принципы ООП, согласно им свойства/методы имеет не экземпляр класса, а класс. Если вы хотите, чтобы один класс имел другие свойства/методы относительно другого класса это решается на уровне иерархии классов. В вашем примере это бы выглядело так:
abstract class HumanHero {
public abstract void fly();
}
class Prometheus extends HumanHero {
public void fly() { System.out.println("No, I can't fly"); }
}
class Hercules extends HumanHero {
public void fly() { System.out.println("Flying is awesome!"); }
}
Нет, ну можно конечно нагородить другую конструкцию в более традиционном не в ООП стиле:
class HumanHero {
private boolean canFly=false;
public void fly() {
if(canFly)
System.out.println("Flying is awesome!");
else
System.out.println("No, I can't fly");
}
public void setCanFly(boolean canFly) {
this.canFly=canFly;
}
}
Фактически это означает, что Зевс должен заранее при проектировании понимать, какие методы и свойства могут иметь его герои.
Нет, ну можно конечно придумывать разные хаки, например можно генерировать исходники компилировать их на лету через JavaCompiler загружая через ClassLoader
или сделать некий метод, к которому цеплять в зависимости от пожеланий Зевса некие парсируемые инструкции и т.д. - но это все хаки.
Экземпляры и методы класса хранятся в различных областях памяти. Экземпляры хранятся в "куче" и содержат только данные для каждого экземпляра отдельно, тогда как методы связаны с классом, хранятся в "Method Area" один раз.
Создавая новый экземпляр вы получаете в куче новое место под данные, но не новый список методов в "Method Area".
По этой причине добавить метод непосредственно экземпляру нельзя. Инструкция, содержащая ссылку на новый метод все равно должна обращаться к "Method Area". А чтобы положить туда этот метод придется создать или модифицировать какой то класс.
В Java это невозможно. Но это есть в JavaScript и это называется прототипным программированием.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Почему когда c условием в методе clickEquals при делении на ноль выходит из приложения(В приложении 'Calculyator' произошла ошибка),а без нее выводит...
В своей программе я использовал оператор == для сравнения строкНо я наткнулся на баг, и при замене == на equals он пропал
Захотелось сделать приложение, которое будет в 15:45 включать звук на телефоне, а в 8:45 отключать звукЗахотелось реализовать через AsyncTask