- •Содержание
- •Введение
- •1. Основные понятия языка Java иUml
- •Простое приложение
- •Простой апплет
- •Классы и объекты
- •Базовые типы данных
- •Операторы
- •If (obj instanceof java.Awt.Font) {/*операторы*/}
- •Операторы управления
- •UmLкак язык описания объектно-ориентированных программ
- •2. Библиотека стандартаJava_se Наследование
- •Использование super и this
- •Абстрактные классы и интерфейсы
- •Переопределение методов
- •Перегрузка методов
- •Полимофизм и расширяемость
- •Статические методы и полиморфизм
- •Внутренние (inner) классы
- •Вложенные классы (nested)
- •Анонимные классы
- •Использование библиотек классов Файлы. Потоки ввода/вывода
- •Обработка исключительных ситуаций
- •Коллекции
- •Графические интерфейсы пользователя
- •События и их обработка
- •Элементы управления
- •2. Библиотека стандартаJava_ee
- •ТехнологииJsp
2. Библиотека стандартаJava_se Наследование
Один класс (подкласс) может наследовать переменные и методы другого класса (суперкласса), используя ключевое слово extends. Подкласс имеет доступ ко всем открытым переменным и методам родительского класса, как будто они находятся в подклассе. В то же время подкласс может иметь методы с тем же именем и сигнатурой, что и методы суперкласса. В этом случае подкласс переопределяет методы родительского класса. В следующем примере переопределяемый метод show() находится в двух классах Bird и Eagle. По принципу полиморфизма вызывается метод, наиболее близкий к текущему объекту.
/* пример # 1 : наследование класса и переопределение метода : BirdSample.java */
classBird {
private float price;
privateString name;
public Bird(float p, String str) { //конструктор
price = p;
name = str;
}
public float getPrice(){
returnprice;
}
public String getName(){
returnname;
}
voidshow(){
System.out.println("название: " +name+ ", цена: "+price);
}
}
class Eagle extends Bird {
private boolean fly;
public Eagle(float p, String str, boolean f) {
super(p,str); //вызов конструктора суперкласса
fly=f;
}
voidshow(){
System.out.println("название:" +getName() + ", цена: " +
getPrice() + ", полет:" + fly);
}
}
public class BirdSample {
public static void main(String[] args) {
Bird b1 = new Bird(0.85F, "Гусь");
Bird b2 = new Eagle(10.55F, "Белый Орел", true);
b1.show(); // вызов show() класса Bird
b2.show(); // вызов show() класса Eagle
}
}
Объект b1 создается при помощи вызова конструктора класса Bird, и, соответственно, при вызове метода show(), вызывается версия метода из класса Bird. При создании объекта b2 ссылка типа Bird инициализируется объектом типа Eagle. При таком способе инициализации ссылка на суперкласс получает доступ к методам, переопределенным в подклассе.
При объявлении совпадающих по сигнатуре полей в суперклассе и подклассах их значения не переопределяются и никак не пересекаются, то есть существуют в одном объекте независимо друг от друга. В этом случае задача извлечения требуемого значения определенного поля, принадлежащего классу в цепочке наследования, ложится на программиста.
Использование super и this
Ключевое слово superиспользуется для вызова конструктора суперкласса и для доступа к члену суперкласса. Например:
super(список_параметров); /* вызов конструктора суперкласса с передачей параметров */
super.i = n; /* присваивание значения атрибуту суперкласса */
super.method(); // вызов метода суперкласса
Вторая форма superподобна ссылкеthisна экземпляр класса. Третья форма специфична дляJavaи обеспечивает вызов переопределенного метода, причем если в суперклассе этот метод не определен, то будет осуществляться поиск по цепочке наследования до тех пор, пока метод не будет найден. Каждый экземпляр класса имеет неявную ссылкуthisна себя, которая передается также и методам. После этого можно писатьthis.price хотя и необязательно.
Следующий код показывает, как, используя this, можно строить одни конструкторы на основе других.
// пример # 3 : this в конструкторе : Locate3D.java
classLocate3D {
private int x, y, z;
public Locate3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
public Locate3D() {
this(-1, -1, -1);
}
}
В этом классе второй конструктор для завершения инициализации объекта обращается к первому конструктору. Такая конструкция применяется в случае, когда в классе имеется несколько конструкторов и требуется добавить конструктор по умолчанию.
Ссылка this используется в методе для уточнения того, о каких именно переменныхxиyидет речь в каждом отдельном случае, а конкретно для доступа к переменной класса, если в методе есть локальная переменная с тем же именем. Инструкцияthisдолжна быть единственной в вызывающем конструкторе и быть первой по счету выполняемой операцией.