Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
// как закрытые, нельзя.
return width * height / 2; // Ошибка! Доступ запрещен.
}
void showStyle() {
System.out.println("Triangle is " + style);
}
}
Класс Triangle не будет скомпилирован, поскольку ссылки на переменные экземпляра width и height в методе area () нарушают правила доступа. Эти переменные объявлены закрытыми (private), и поэтому они доступны только членам собственного класса. А его подклассам запрещено обращаться к ним.
Напомним, что член класса, объявленный закрытым (private), недоступен за пределами своего класса. Это ограничение распространяется и на подклассы.
На первый взгляд, ограничение на доступ к закрытым членам суперкласса из подкласса кажется трудно преодолимым, поскольку оно не дает во многих случаях возможности пользоваться закрытыми членами этого класса. Но на самом деле это не так. Как пояснялось в главе 6, для обращения к закрытым членам класса в программах на Java обычно используются специальные методы доступа. Ниже в качестве примера приведены видоизмененные классы TwoDShape и Triangle, в которых обращение к переменным экземпляра width и height осуществляется с помощью специальных методов доступа.
// Применение методов доступа для установки и
/// получения значений закрытых переменных.
// Класс, описывающий двумерные объекты,
class TwoDShape {
private double width; // Теперь эти переменные
private double 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 {
String style;
double area() {
// Применение методов доступа, предоставляемых суперклассом.
return getWidth() * getHeightO / 2;
}
void showStyle() {
System.out.println("Triangle is " + style);
}
}
class Shapes2 {
public static void main(String args[]) {
Triangle tl = new Triangle();
Triangle t2 = new Triangle();
tl.setWidth(4.0);
tl. setHeight(4.0) ;
tl.style = "isosceles";
t2.setWidth(8.0);
t2.setHeight(12.0);
t2.style = "right";
System.out.println("Info for tl: ");
tl.showStyle();
tl.showDim();
System.out.println ("Area is " + tl.areaO);
System.out.println() ;
System.out.println("Info for t2: ") ;
t2.showStyle();
t2.showDim();
System.out.println("Area is " + t2.area());
}
}
Конструкторы и наследование
В иерархии классов допускается, чтобы у суперклассов и подклассов были свои собственные конструкторы. В связи с этим возникает следующий резонный вопрос: какой конструктор отвечает за построение объекта подкласса: конструктор суперкласса, конструктор подкласса или же оба вместе? На этот вопрос можно ответить так: конструктор суперкласса конструирует родительскую часть объекта, а конструктор подкласса — производную часть этого объекта. И в этом есть своя логика, поскольку суперклассу неизвестны и недоступны любые элементы подкласса, а следовательно, их конструирование должно происходить раздельно. В приведенных выше примерах данный вопрос не возникал, поскольку они опирались на автоматическое создание конструкторов, используемых в Java по умолчанию. Но на практике конструкторы определяются явным образом в большинстве классов. Ниже будет показано, каким образом разрешается подобная ситуация.