Основы программирования на Java - страница 14

Шрифт
Интервал

стр.

с именем класса, в котором он расположен. У конструкторов нет типа возвращаемого результата - никакого, даже void. Заменим метод init из предыдущего примера конструктором.


>class Point {

>int х, у;

>Point(int х, int у) {

>this.x = x;

>this.y = y;

>}

>}

>class PointCreate {

>public static void main(String args[]) {

>Point p = new Point(10,20);

>System.out.println("x = " + p.x + " у = " + p.y);

>}

>}

7.7. Совмещение методов

Язык Java позволяет создавать несколько методов с одинаковыми именами, но с разными списками параметров. Такая техника называется совмещением методов (method overloading). В качестве примера приведена версия класса Point, в которой совмещение методов использовано для определения альтернативного конструктора, который инициализирует координаты х и у значениями по умолчанию (-1).


>class Point {

>int х, у;

>Point(int х, int у) {

>this.x = х;

>this.y = у;

>}

>Point() {

>х=-1;

y=-1;

}

>}

>class PointCreateAlt {

>public static void main(String args[]) {

>Point p = new Point();

>System.out.println("x = " + p.x + " у = " + p.y);

>}

>}

В этом примере объект класса Point создается не при вызове первого конструктора, как это было раньше, а с помощью второго конструктора без параметров. Результат работы этой программы:

>х = -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 частично повторялся код, уже имевшийся в суперклассе. Вспомните, как во втором конструкторе мы использовали


стр.

Похожие книги