Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
// Теперь метод area () является абстрактным.
abstract double area();
}
// Подкласс, производный от класса TwoDShape,
// для представления треугольников,
class Triangle extends TwoDShape {
private String style;
// Конструктор по умолчанию.
Triangle() {
super () ;
style = "null";
}
// Конструктор класса Triangle.
Triangle(String s, double w, double h) {
super(w, h, "triangle");
style = s;
}
// Конструктор с одним аргументом для построения треугольника.
Triangle(double х) {
super(х, "triangle"); // вызвать конструктор суперкласса
style = "isosceles";
}
// построить один объект на основании другого объекта
Triangle(Triangle ob) {
super(ob); // передать объект конструктору класса TwoDShape
style = ob.style;
}
double area() {
return getWidth() * getHeight() / 2;
}
void showStyle() {
System.out.println("Triangle is " + style);
}
}
// Подкласс, производный от класса TwoDShape,
// для представления прямоугольников.
class Rectangle extends TwoDShape {
// Конструктор по умолчанию.
Rectangle() {
super();
}
// Конструктор класса Rectangle.
Rectangle(double w, double h) {
super(w, h, "rectangle"); // вызвать конструктор суперкласса
}
// построить квадрат
Rectangle(double х) {
super(х, "rectangle"); // вызвать конструктор суперкласса
}
// построить один объект на основании другого объекта
Rectangle(Rectangle ob) {
super(ob); // передать объект конструктору класса TwoDShape
}
boolean isSquare() {
if (getWidth () == getHeightO) return true;
return false;
}
double area() {
return getWidth () * getHeightO;
}
}
class AbsShape {
public static void main(String args[]) {
TwoDShape shapes[] = new TwoDShape[4];
shapes[0] = new Triangle("right", 8.0, 12.0);
shapes[1] = new Rectangle(10);
shapes[2] = new Rectangle(10, 4);
shapes[3] = new Triangle(7.0);
for(int i=0; i < shapes.length; i++) {
System.out.println("object is " +
shapes[i].getName());
System.out.println("Area is " + shapes[i].area());
System.out.println();
}
}
}
Как показывает представленный выше пример программы, во всех подклассах, производных от класса TwoDShape, метод area () должен быть непременно переопределен. Убедитесь в этом сами, попробовав создать подкласс, в котором не переопределен метод area (). В итоге вы получите сообщение об ошибке во время компиляции. Конечно, возможность создавать ссылки на объекты типа TwoDShape по-прежнему существует, и это было сделано в приведенном выше примере программы, но объявлять объекты типа TwoDShape уже нельзя. Именно поэтому массив shapes сокращен в методе main () до 4 элементов, а объект типа TwoDShape для общей двумерной геометрической формы больше не создается.
И еще одно, последнее замечание. Обратите внимание на то, что в классе TwoDShape по-прежнему присутствуют определения методов showDim () и getName () и перед их именами нет модификатора abstract. В абстрактные классы вполне допускается (и часто практикуется) включать конкретные методы, которые могут быть использованы в своем исходном виде в подклассе. А переопределению в подклассах подлежат только те методы, которые объявлены как abstract.
Использование ключевого слова final