Главная » Java » Наследование – Рыбка Тоже Домашнее Животное

0

важной особенностью языка Java,  которая  называется  наследование  (inheritance).  В  реальном  мире каждый  человек  наследует что-­?то  от  своих  родителей. В мире Java вы тоже можете создать новый класс  по типу уже существующего. Класс  Pet,  и  ведет  себя,  и  имеет  атрибуты типичные  для  многих домашних  животных – они едят, спят, некоторые из  них издают звуки, их кожа имеет цвет и так далее. С другой стороны, домашние животные отличаются  друг  от друга – собаки лают, рыбки беззвучно плавают, попугайчики разговаривают лучше, чем собаки.

И все-­?же, все они спят, едят, и имеют рост и вес. Поэтому гораздо легче создать  класс  Fish  (рыба)  так,  чтобы  он  унаследовал  общие  черты  и поведение  у класса Pet, чем каждый раз  создавать с начала классы  для собак, попугаев и рыб. Для  этого и существует специальное ключевое слово extends:

Теперь вы  имеете полное право сказать что Fish -­? это  подкласс класса Pet,  а  класс  Pet  –  это  супер-­?класс  класса  Fish.  Мы  использовали  класс Pet,  как  свообразный  шаблон  для  создания  класса  Fish. class Fish extends Pet{

}

Даже  если вы оставите класс Fish таким, как он есть сейчас, всё равно уже можно использовать каждый метод и атрибут, унаследованный из класса Pet. Вот посмотрите: Fish myLittleFish = new Fish();

myLittleFish.sleep();

Хоть  мы ещё и не объявляли никаких методов в классе Fish, уже можновызывать  метод sleep(), находящийся в его супер-­?классе!

Нет  ничего легче создания подклассов в приложении Eclipse! Выберите меню File, New, Class и напечатайте слово  Fish, как имя класса. Замените в поле супер-­?класс java.lang.Object на слово Pet.

Не забывайте, что мы  создаем подкласс класса Pet, чтобы  добавить то, что  присуще  только  рыбам,  а  общий  для  всех  животных  код, объявленный в супер-­?классе, мы просто используем. Не все домашние животные могут нырять, но рыбки, конечно же, могут. Давайте  добавим к классу Fish метод dive() -­? нырни.У  метода dive()  есть параметр howDeep, который “говорит” рыбке, как глубоко  она   должна   нырнуть.   А ещё  мы  объявили   переменную currentDepth, куда  будем  помещать  текущее  значение  глубины при каждом   вызове метода dive().  Этот метод возвращает значение переменной currentDepth вызывающему классу. Сделайте,  пожалуйста, вот такой класс FishMaster:

Пора  рассказать маленький секрет – все классы в языке Java унаследованы из супер-­?дупер класса Object, даже если вы и не использовали ключевое слово extends.В отличие от людей, Java-­?классы не могут иметь двух родителей.  А если бы у нас это было как в языке Java , дети не были бы“подклассами”  своих родителей, а все мальчики происходили бы от Адама, а девочки – от  Евы ?.

public class Fish extends Pet {

int currentDepth=0;

public int dive(int howDeep){ currentDepth=currentDepth + howDeep; System.out.println("Ныряю на глубину "

+ howDeep + " футов"); System.out.println("Я на глубине "

+ currentDepth + " футов ниже уровня моря");

return currentDepth;

}

}

Метод main() в классе FishMaster создает экземпляр объекта Fish и дважды вызывает его метод dive() с разными параметрами. После этого он вызывает метод sleep().  public class FishMaster {

public static void main(String[] args) { Fish myFish = new Fish(); myFish.dive(2);

myFish.dive(3);

}

}

myFish.sleep();

Во время  выполнения FishMaster напечатает следующее:Ныряю на глубину 2 футов

Я на глубине 2 футов ниже уровня моря

Ныряю на глубину 3 футов

Я на глубине 5 футов ниже уровня моря

Спокойной ночи, до завтраВы  заметили, что FishMaster вызывает не только методы  объявленные в  классе  Fish,  но  также  и  метод  sleep()  его  супер-­?класса  Pet?  То-­?то!  В этом  и есть вся  прелесть наследования – вам не нужно копировать код из класса  Pet.  Просто  напишите  слово  extends  и  класс  Fish  сможет пользоваться  методами класса Pet!

Да,  вот ещё что,  хотя  метод dive() и возвращает значение переменной currentDepth,  наш  FishMaster  им  не  пользуется.  Это  не  беда,  просто нашему   классу FishMaster оно не нужно. Но каким-­?нибудь   другим классам,  которые тоже могут работать с классом Fish, это значение может   быть очень даже полезно. Представьте, например, класс FishTrafficDispatcher  (регулировщик  движения рыб), который должен знать  положения других рыб  в море, прежде чем разрешить ныряние во избежание дорожно-­?транспортных происшествий ?.Переопределение методовВы,  конечно,  знаете,  что  рыбы  не  говорят  (по  крайней  мере  он  не делают это громко). Но наш класс Fish был унаследован из класса Pet, у которого есть метод say(). Это значит, что вы беспрепятственно можете написать что-­?то в этом роде:

myFish.say();

Ну и ну, наши рыбки заговорили…  Чтобы  избежать этого, в классе Fish нужно переопределить  (override) метод say(), обьявленный в классе Pet. Это работает так: если вы объявляете в под-­?классе метод имеющий точно  такой-­?же  заголовок,  как  в  его-­?же  супер-­?классе,  Java  выполнит метод под-­?класса,   вместо метода супер-­?класса. Давайте добавим к классу Fish метод say().

public String say(String something){

return "Ты чё не знаешь, что рыбы не разговаривают?";

}

А теперь вызовем метод say() из метода main() класса FishMaster:

myFish.say("Привет");

Выполните  эту программу и она напечатает следующее:

Ты чё не знаешь, что рыбы не разговаривают?

Это подтверждает,  что метод say() класса Pet был переопределен. Вот  это да! Мы изучили много нового в этой главе – давайте передохнём. Если  заголовок метода включает ключевое слово final, такой методпереопределить  нельзя, например:

final public void sleep(){…}

Дополнительное чтение

1.Java  Data Types:

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/da tatypes.html

2.About  inheritance: http://java.sun.com/docs/books/tutorial/java/concepts/inherit ance.html

Практические упражнения

1.  Создайте новый класс Car (автомобиль) ивключите  в него следующие методы:

public void start()

public void stop()

public int drive(int howlong)

Метод  drive() (едь) должен возвращать общее  расстояние   пройденное  автомобилем   за  заданное  время.  Используйте  следующую формулу дла  рассчёта расстояния:

distance = howlong*60;

2. Создайте ещё один класс CarOwner (хозяин  автомобиля),    который  будет  создавать  экземпляр   объекта  Car  и  вызывать  его методы.  Результат   каждого   такого   вызова  должен   быть  напечатан   с   помощью  System.out.println().

Практические упражнения для умников и умниц

 

Сделайте подкласс класса Car, назовите его JamesBondCar (автомобиль Джемса Бонда) и переопределите в нем метод drive(). Используйте следующую формулу дла рассчёта расстояния:

distance = howlong*180;

           Будьте  изобретательны! Печатайтесмешные 

Источник: Java  Programming for Kids, Parents and Grandparents by Yakov Fain

По теме:

  • Комментарии