
interface Funny {
void beGlad();
}
interface Employee {
void doWork();
}
interface Pedestrian {
void crossRoad();
}
class Person implements Funny, Employee, Pedestrian {
private String name;
private String lastName;
Person(String name, String lastName) {
this.name = name;
this.lastName = lastName;
}
public void getName() {
System.out.println("My name is " + lastName
+ ". " + name + " " + lastName);
}
@Override
public void beGlad() {
System.out.println("I'm happy!");
}
@Override
public void doWork() {
System.out.println("I'm busy. Please, call me back later.");
}
@Override
public void crossRoad() {
System.out.println("Why, why, why\nWas the traffic light green?");
}
}
Person jon = new Person("Jon", "Smith");
jon.getName(); // My name is Smith. Jon Smith
Funny jonFunny = (Funny)jon;
jonFunny.beGlad(); // I'm happy!
Pedestrian jonPedestrian = (Pedestrian)jon;
jonPedestrian.crossRoad(); // Why, why, why
// Was the traffic light green?
В Java есть два вида полиморфизма: статический и динамический.
Статический полиморфизм - перегрузка методов. Определяется на стадии компиляции. Т.е. компилятор знает какой именно метод будет вызван.
class Rubbit {}
class Hunter {}
class Fox {
void run(Rubbit rubbit) {
// сократить дистанцию
}
void run(Hunter hunter) {
// увеличить дистанцию
}
}
В этом примере поведение лисы зависит от того, с каким аргументом был вызван её метод run(). Если туда передан кролик, то лиса начинает его догонять. Если охотник - лисе нужно убегать. Т.о. статический полиморфизм - поведение объекта в зависимости от контекста.Динамический полиморфизм - способность объектов, имеющих общего родителя, решать одни и те же задачи разными способами. Например, отец всю жизнь ищет свои носки. И сын ищет свои носки, но сын для этого приобщает еще и свою жену. Задача одна и та же, способы разные. Динамический полиморфизм - переопределение методов родительского класса. Определяется на стадии выполнения. Компилятор не знает, какая именно реализация метода будет вызвана.
class Father {
void findMySocks() {
// заглянуть под диван, под матрас, в корзину с грязным бельём
}
}
class Son extends Father {
@Override
void findMySocks() {
// сказать жене, чтобы нашла носки
}
}