class Main {
public static void main(String[] args) {
Phone p = new MyPhone();
p.sayHello();
}
}
class Phone{
void sayHello(){System.out.println("Hello Phone");}
}
class MyPhone extends Phone{
void sayHello(){System.out.println("Hello MyPhone");}
}
дочерний класс переписывает/перекрывает (overrides) метод родительского класса. Если убрать имплементацию из дочернего класса то будет вызван родительский метод. Используется тип ссылки более общего типа, потому что это "наименьший общий делитель" всего семейного древа, так сказать. Дочерние классы могут может еще много чего, но то что определено в родительском классе они могут гарантированно.
Ссылка родительского общего типа может использоваться при обходе коллекций, когда эелементы коллекции могут быть разными детьми но нужно у каждого вызвать этот метод. Так работает например шаблон наблюдатель. Используется тип интефейса как общий знаменатель, все классы которые хотят получать обновления, заносятся в список. И когда событие наступает, пробегаем список и у каждого элемента дергаем метод update, a что произойдет при update решает каждый класс для себя сам.