- •Java - объектно-ориентированный язык
- •Виртуальная Java-машина.
- •Алфавит языка Java
- •Типы данных
- •Числа высокой точности
- •Переменные в Java
- •Объявление переменной
- •Область действия и время жизни переменной
- •Операции в Java
- •Арифметические операции
- •Логические операции
- •Побитовые операции
- •Операции сдвига
- •Тернарный оператор ?:
- •Оператор запятая
- •Одномерные массивы
- •Многомерные массивы
- •Функции
- •Класс Поля и методы
- •Модификаторы доступа
- •Инициализация и очистка
- •Перегрузка методов
- •Ключевое слово this
- •Вызов конструктора из конструктора
- •Использование объектов в качестве параметров
- •Ключевое слово static
- •Спецификатор final
- •Вложенные и внутренние классы
- •Сборщик «мусора»
- •Как работает сборщик мусора
- •Наследование
- •Основы наследования
- •Использование ключевого слова super
- •Использование super для вызова конструктора суперкласса
- •Использование super для доступа к скрытым членам суперкласса
- •Конструкторы при наследовании
- •Динамическая диспетчеризация методов
- •Абстрактные классы
- •Использование final с наследованием
- •Использование final для отказа от переопределения
- •Использование final для отмены наследования
- •Класс Object
- •Пакеты и интерфейсы Пакеты
- •Оператор package
- •Оператор import
- •Уровни доступа.
- •Интерфейсы
- •Оператор implements
- •Частичные реализации
- •“Множественное” наследование в Java
- •Конфликты имен при комбинировании интерфейсов
- •Расширение интерфейса
- •Группировка констант
- •Инициализирование полей в интерфейсах
- •Вложенные интерфейсы
- •Стандартный ввод/вывод
- •Чтение из стандартного ввода
- •Замена System.Out на PrintWriter
- •Первое приложение Java
- •Исключительные ситуации. Обработка исключений
- •Типы исключений
Конструкторы при наследовании
В рассмотренных выше примерах мы видели использование конструкторов в суперклассе и подклассе. В данной иерархии может быть только один основной суперкласс и сколько угодно производных от него подклассов, каждый из которых может являться суперклассом для производных от него. Как же при этом вызываются и выполняются конструкторы классов при такой иерархии? Если в конструкторе подкласса есть оператор super (он всегда первый), то перед выполнением конструктора подкласса управление передается соответствующему конструктору суперкласса. Если super отсутствует, то это не влияет на порядок выполнения конструкторов. При этом из конструктора подкласса будет вызван конструктор без параметров суперкласса. Этот порядок вызова конструкторов логичен, так как при создании объекта подкласса суперкласс (его конструктор) ничего не знает о своем подклассе. И логично выполнить создание его подобъекта и инициализацию вначале. А далее только достраивать объект.
Динамическая диспетчеризация методов
Как отмечалось ранее, в иерархии наследования, может быть выполнено переопределение методов суперкласса в подклассах. Напомним, что переопределенными методами называются такие методы, имеющие одинаковую сигнатуру типов (т.е. совпадает тип возвращаемого значения, имя метода, число и тип параметров). Методика переопределения является основой для одной из мощных концепций Java – динамической диспетчеризации методов. Динамическая диспетчеризация это механизм, на основании которого принимается решение на вызов того или иного переопределенного метода во время выполнения, а не компиляции. Динамическая диспетчеризация является одной из сторон реализации принципа полиморфизма в Java.
Рассмотрим механизм, на котором основана диспетчеризация. Как отмечалось ранее, ссылочная переменная суперкласса может обращаться к объектам подкласса. При вызове через эту ссылку переопределенного метода, решение о том какой из методов будет вызван, принимается на основании типа объекта, на который указывает ссылка (а не на основании типа ссылочной переменной). Это возможно определить только во время выполнения, когда ссылка (ссылочная переменная) принимает конкретное значение. Приводимый ниже пример показывает динамическую диспетчеризацию методов.
class A // суперкласс А
{ protected int a;
A() { } // конструктор без параметров
A(int aa) // конструктор c параметрами
{ a = aa; } // создание нового объекта
void show()
{ System.out.println("supperclass a = " + a); }
}
class B extends A // подкласс В
{ protected int b;
B() { } // конструктор без параметров
B(int aa, int bb) // конструктор с параметрами
{ super(aa);
b = bb;
}
void show()
{ System.out.println("subclass b= " + b); }
}
class C extends B // подкласс C
{
private int c;
C() { } // конструктор без параметров
C(int aa, int bb, int cc) // конструктор с параметрами
{ super(aa,bb);
c = cc;
}
void show()
{ System.out.println("subclass c= " + c); }
}
class start
{ public static void main(String[] args
{ A ob1 = new A(1);
B ob2 = new B(2,3);
C ob3 = new C(4,5,6);
A ob;
ob=ob1;
ob.show();
ob=ob2;
ob.show();
ob=ob3;
ob.show();
}
}
Результат выполнения программы:
supperclass a = 1
subclass b= 3
subclass c= 6