Как описать класс и подкласс
Переопределение методов приводит к интересным результатам. В классе Pet мы описали метод voice(). Переопределим его в подклассах и используем в классе chorus, как показано в листинге 2.2.
Листинг 2.2. Пример полиморфного метода.
abstract class Pet{ abstract void voice(); } class Dog extends Pet{ int k = 10; void voice(){ System.out.printin("Gav-gav!"); } } class Cat extends Pet{ void voice () { System.out.printin("Miaou!"); } } class Cow extends Pet{ void voice(){ System.out.printin("Mu-u-u!"); } } public class Chorus( public static void main(String[] args){ Pet[] singer = new Pet[3]; singer[0] = new Dog(); singer[1] = new Cat(); singer[2] = new Cow(); for (int i = 0; i < singer.length; i++) singer[i].voice(); } }
На рис. 2.1 показан вывод этой программы. Животные поют своими голосами!
Все дело здесь в определении поля singer[]. Хотя массив ссылок singer [] имеет тип Pet, каждый его элемент ссылается на объект своего типа Dog, Cat, cow. При выполнении программы вызывается метод конкретного объекта, а не метод класса, которым определялось имя ссылки. Так в Java реализуется полиморфизм.
Знатокам C++
В языке Java все методы являются виртуальными функциями.
Внимательный читатель заметил в описании класса Pet новое слово abstract. Класс Pet и метод voice() являются абстрактными.
Рис. 2.1. Результат выполнения программы Chorus