3.5 Наследование

3.5 Наследование


Наследование не что иное, как приобретение свойства другого объекта или класса. Наследование в Java осуществлено отношениями подкласса и суперкласса. Суперкласс - это класс, от которого будет происходить наследование, и подкласс - это класс, который наследовал качества суперкласса. Когда наследование осуществлено, подкласс получает свойства суперкласса плюс его собственные свойства. Например, рассмотрите классы Транспортное средство и Скутер. Свойства класса Транспортное средство - скорость, вместимость, а свойства класса Скутера - вместимость бензина, механизм. Класс Скутер унаследован от класса Транспортное средство. Тогда класс Транспортное средство становится суперклассом, а класс Скутера становится подклассом. Класс Скутера получает свойства (скорость, вместимость) класса Транспортного средства, плюс он имеет свои собственные свойства (вместимость бензина, механизм). Таким образом, подкласс содержит собственные свойства, так же как и его суперкласс.

Возьмём другой пример для объяснения наследования. Рассмотрим класс Fruit. Есть два других класса SeasonalFruits и AIISeasonFruits, которые получены из класса Fruit. Класс Fruit является суперклассом, а классы SeasonalFruits и AIISeasonFruitsare - его подклассы.

Схематическое представление этих классов следующее:
Рисунок 3.11: Схематическое представление наследования

Здесь класс Fruit - суперкласс для класса SeasonalFruits так же как и для класса AIISeasonFruits. SeasonalFruits - суперкласс для класса Mango и Cherry. AIISeasonFruits суперкласс для Banana и Lemon. Тем же самым способом, Banana и Lemon - подклассы класса AIISeasonFruits и так далее.

3.5.1 Расширенное понятие наследования

В Java используется расширенное понятие наследования. Поскольку подкласс добавляет к своим свойствам унаследованные свойства суперкласса, объект подкласса может обращаться к любому методу суперкласса, но не наоборот. Это происходит потому, что подкласс знает свойства и методы своего суперкласса, так как он унаследован от него. Но суперкласс не знает различные свойства и методы своего подкласса. Суперкласс может иметь п подклассов, но подкласс в Java может непосредственно иметь только один суперкласс.

Обратите внимание: Java не поддерживает концепцию множественного наследования.

3.5.2 Полиморфизм

Полиморфизм гарантирует вызов соответствующего метода для объекта определенного типа. Полиморфизм позволяет каждому типу объекта определять своё собственное поведение. Становится возможным проектировать и осуществлять системы, которые являются более расширяемыми - программы могут быть написаны, чтобы обрабатывать типы объектов, которые не могут существовать, когда программа находится в стадии разработки.
Пример 8:
class SillyMath
{
int a ;
SillyMath(int inA)
      {
a = inA;
      }
int add(int b)
      {
return a + b;
      }
float add(float b)
      {
return ((float)a + b);
      }
double add(double b)
      {
return ((double)a + b);
      }
}
public class PolyTst
{
public static void main(String args[])
      {
SillyMath num = new SillyMath(10);
int c=10;
float d = (float) 30.2;
double e = 459998.8;
System.out.println( adding an int   :   + num.add );
System.out.println( adding a float   :   + num.add(d));
System.out.println( adding a double:   + num.add(e));
      }
}


Вывод показан ниже:
Рисунок 3.12: Вывод

Класс PolyTst осуществляет одну простую форму полиморфизма в отдельном классе, позволяя использовать одно название метода, add (), который использован для выполнения различных операций добавления. Компилятор различает между собой функции добавления (add ()) по типу параметров.

3.5.3 Ключевое слово super

Ключевое слово super используется объектом в качестве ссылки к методам и полям класса, который это расширило. Оно является основной частью осуществления наследования и полиморфизма. Наиболее часто это ключевое слово используется в конструкторе объекта, чтобы передать параметры конструкции цепочки наследования.

Рассмотрите класс Employee. Класс Employee может иметь простой конструктор, который формирует string и int и присваивает им значения переменных:
Employee (String n, int i)
          {
String name = n;
int employee_id = i;
          }


Теперь предположите, что мы должны были «расширить» класс Employee, чтобы создать класс Programmer.
class Programmer extends Employee   {

Объект класса Programmer был бы тот же самый что и объект класса Employee (так как класс Programmer наследуется от класса Employee) за исключением того, что он может иметь другое свойство, скажем, предпочтение языка.

Как только в классе Programmer объявляется, что он наследуется от класса Employee, то он автоматически получает все свойства и методы, объявленные в классе Employee.

Вместо того, чтобы всё переопределять, что уже определено в классе Employee, мы использует ключевое слово super, чтобы обратиться к методам родительского класса. Например, чтобы обратиться к конструктору класса Employee, мы можем сделать следующее:
class Programmer extends Employee
{
Programmer (String n,   int i,   String 1)
      {
super(n,i);
String language_preference = 1;
      }
}


Ключевое слово super() также полезно, когда мы хотим вызвать выполнение чего-либо из родительского класса (подобно методу), что мы отменили в наследуемом классе.

Предположим, что в классе Employee определён метод рау() (оплата). Тогда предположим, что в классе Programmer он отменяется и определяется собственный метод рау(). Каким же образом мы можем получить доступ к методу рау() Employee из Programmer?

Если бы мы вызвали Programmer.pay(), мы получили бы Programmer.pay() а не Employee.pay().
Итак, чтобы добраться к Employee.pay() мы должны использовать super.pay().

3.5.4 instanceof

instanceof проверяет, является ли тип во время выполнения первого параметра назначением, совместимым со вторым параметром.
Пример 9:
class Student
{
// some code
}
class Graduate extends Student
{
//some code
}
class UndergraduateStudent extends Student
{
// some code
}
public class st
{
public static void main(String []args)
    {
Student x = new UndergraduateStudent();
if (x instanceof UndergraduateStudent)
System.out.println( Mr. X is an undergraduate student. );
else
System.out.println( Mr. X is an graduate student. );
    }
}


Вывод показан ниже:
Рисунок 3.13: Вывод
В вышеупомянутом примере, инструкция if проверяет, объект х - instanceof класс UndergraduateStudent. В этом случае условие оценивает как истина и тогда печатается "Mr. x is an undergraduate student.

назад к оглавлению вперед

Rus. Open Source company, г. Саратов
ул. Орджоникидзе, 156, офис 203
тел: 8 (8452) 57-84-41
e-mail: info@rus_opensource.com

Главная | Обзоры | О разном
Карта сайта

Учебная литература:

Введение в Linux
Основы JAVA
Архивы

© 2013 opensourcerules.net