Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
Следует особо подчеркнуть, что доступ к конкретным членам класса определяется типом переменной ссылки на объект, а не типом объекта, на который она ссылается. Это означает, что если ссылка на объект подкласса присваивается переменной ссылки на объект суперкласса, то доступ разрешается только к тем частям этого объекта, которые определяются суперклассом. Именно поэтому переменной х2 недоступен член b класса Y, когда она ссылается на объект этого класса. И в этом есть своя логика, поскольку суперклассу ничего не известно о тех членах, которые добавлены в производный от него подкласс. Именно поэтому последняя строка кода в приведенном выше примере была закомментирована.
Несмотря на кажущийся несколько отвлеченным характер приведенных выше рассуждений, им можно найти ряд важных применений на практике. Одно из них рассматривается ниже, а другое — далее в этой главе, когда речь пойдет о переопределении методов.
Один из самых важных моментов для присваивания ссылок на объекты подкласса переменным суперкласса наступает тогда, когда конструкторы вызываются в иерархии классов. Как вам должно быть уже известно, в классе нередко определяется конструктор, принимающий объект своего класса в качестве параметра. Благодаря этому в классе может быть сконструирована копия его объекта. Этой особенностью можно выгодно воспользоваться в подклассах, производных от такого класса. В качестве примера рассмотрим очередные версии классов TwoDShape и Triangle. В оба класса добавлены конструкторы, принимающие объект своего класса в качестве параметра.
class TwoDShape {
private double width;
private double height;
// Конструктор по умолчанию.
TwoDShape() {
width = height = 0.0;
}
// Параметризированный конструктор.
TwoDShape(double w, double h) {
width = w;
height = h;
}
// построить объект с одинаковыми значениями
// переменных экземпляра width и height
TwoDShape(double х) {
width = height = x;
}
// Построение одного объекта на основании другого объекта.
TwoDShape(TwoDShape ob) {
width = ob.width;
height = ob.height;
}
// Методы доступа к переменным width и height,
double getWidth() { return width; }
double getHeight() { return height; }
void setWidth(double w) { width = w; }
void setHeight(double h) { height = h; }
void showDim() {
System.out.println("Width and height are " +
width + " and " + height);
}
}
// Подкласс класса TwoDShape для треугольников,
class Triangle extends TwoDShape {
private String style;
// Конструктор по умолчанию.
Triangle() {
super();
style = "null";
}
// Конструктор класса Triangle.
Triangle(String s, double w, double h) {
super(w, h); // вызвать конструктор суперкласса
style = s;
}
// Конструктор с одним аргументом для построения треугольника.
Triangle(double х) {
super(х); // вызвать конструктор суперкласса
style = "isosceles";
}
// построить один объект на основании другого объекта
Triangle(Triangle ob) {
// Передача ссылки на объект Triangle конструктору класса TwoDShape.
super(ob);
style = ob.style;
}
double area() {
return getWidth() * getHeight() / 2;
}
void showStyle() {
System.out.println("Triangle is " + style);
}
}
class Shapes7 {
public static void main(String args[]) {
Triangle tl =
new Triangle("right", 8.0, 12.0);
// создать копию объекта tl
Triangle t2 = new Triangle(tl);
System.out.println("Info for tl: ");
tl.showStyle();
tl.showDim();