х = -1
у = -1
Решение о том, какой конструктор нужно вызвать в том или ином случае, принимается в соответствии с количеством и типом параметров, указанных в операторе new. Недопустимо объявлять в классе методы с одинаковыми именами и сигнатурами. В сигнатуре метода не учитываются имена формальных параметров, учитываются лишь их типы и количество.
7.8. Ссылка this
Очередной вариант класса Point показывает, как, используя this и совмещение методов, можно строить одни конструкторы на основе других.
class Point {
int х, у;
Point(int х, int у) {
this.x = x;
this.y = y;
}
Point() {
this(-l,-l);
}
}
В этом примере второй конструктор для завершения инициализации объекта обращается к первому конструктору.
Методы, использующие совмещение имен, не обязательно должны быть конструкторами. В следующем примере в класс Point добавлены два метода distance. Функция distance возвращает расстояние между двумя точками. Одному из совмещенных методов в качестве параметров передаются координаты точки х и у, другому же эта информация передается в виде параметра-объекта Point.
class Point {
int x, у;
Point(int x, int у) {
this.x = x;
this. y = y;
}
double distance(int x, int y) {
int dx = this.x - x;
int dy = this.y - y;
return Math.sqrt(dx*dx + dy*dy);
}
double distance(Point p) {
return distance(p.x, p.y);
} }
class PointDist {
public static void main(String args[]) {
Point p1 = new Point(0,0);
Point p2 = new Point(30,40);
System.out.println("p1 = " + p1.x + ", " + p1.y);
System.out.println("p2 = " + p2.x + " + p2.y);
System.out.println("p1.distance(p2) =” + p1.distance(p2));
System.out.println("p1.distance(60, 80) = " + pl.distance(60, 80));
}}
Обратите внимание на то, как во второй форме метода distance для получения результата вызывается его первая форма. Ниже приведен результат работы этой программы:
p1 = 0,0
р2 = 30,40
p1.distance(p2) = 50.0
pl.distance(60, 80) = 100.0
7.9. Наследование
Основным фундаментальным свойством объектно-ориентированного подхода является наследование. Классы-потомки имеют возможность не только создавать свои собственные переменные и методы, но и наследовать переменные и методы классов-предков. Классы-потомки принято называть подклассами. Непосредственного предка данного класса называют его суперклассом. В очередном примере показано, как расширить класс Point таким образом, чтобы включить в него третью координату z.
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
Point3D() {
this(-1,-1,-1);
}
}
В этом примере ключевое слово extends используется для того, чтобы сообщить транслятору о намерении создать подкласс класса Point. Как видите, в этом классе не понадобилось объявлять переменные х и у, поскольку Point3D унаследовал их от своего суперкласса Point.
7.10. Ссылка super
В примере с классом Point3D частично повторялся код, уже имевшийся в суперклассе. Вспомните, как во втором конструкторе мы использовали thisдля вызова первого конструктора того же класса. Аналогичным образом ключевое слово superпозволяет обратиться непосредственно к конструктору суперкласса.
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
super(x, у); // Здесь мы вызываем конструктор суперкласса
this.z=z;
public static void main(String args[]) {
Point3D p = new Point3D(10, 20, 30);
System.out.println(“ x =” + p.x + ” у =” + p.y + " z =” + p.z);
}
}
Вот результат работы этой программы:
x = 10
y = 20
z = 30
7.11. Замещение методов
Новый подкласс Point3D класса Point наследует реализацию метода distance своего суперкласса. Проблема заключается в том, что в классе Point уже определена версия метода distance(int х, int у), которая возвращает обычное расстояние между точками на плоскости. Мы должны заместить(override) это определение метода новым, пригодным для случая трехмерного пространства. В следующем примере проиллюстрировано и совмещение(overloading), и замещение(overriding) метода distance.
class Point {
int x, у;
Point(int x, int у) {
this.x = x;
this.y = y;
}
double distance(int x, int y) {
int dx = this.x – x;
int dy = this.y - y:
return Math,sqrt(dx*dx + dy*dy);
}
double distance(Point p) {
return distance(p.x, p.y);
}
Читать дальше