Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Ссылка super




В примере с классом Point3D частично повторялся код, уже имевшийся в суперклассе. Вспомните, как во втором конструкторе мы использовали this для вызова первого конструктора того же класса. Аналогичным образом ключевое слово super позволяет обратиться непосредственно к конструктору суперкласса.

class Point3D extends Point { int z;

Point3D(int x, int у, int z) {

super(x, y); // Здесь мы вызываем конструктор суперкласса this.z=z;

public static void main(String args[]) { Point3D p = new Point3D(10, 20, 30);

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

}

}

Вот результат работы этой программы: x = 10 у = 20 z = 30

 

Замещение методов

Новый подкласс Point3D класса Point наследует реализацию метода distance своего суперкласса (пример PointDist.java). Проблема заключается в том, что в классе Point уже определена версия метода distance(int х, int у), которая возвращает обычное расстояние между точками на плоскости. Мы должны заместить (override) это определение метода новым, пригодным для случая трехмерного пространства. В следующем примере проиллюстрировано и совмещение (overloading), и замещение (overriding) метода distance.

 

class Point { int х, у;

Point(int х, int у) { this.x = х;

this.у = у;

}

double distance(int х, int у) { int dx = this.x - х;

int dy = this.у - у:

return Math,sqrt(dx*dx + dy*dy);

}

double distance(Point p) { return distance(p.х, p.y);

}

}

class Point3D extends Point {

int z;

Point3D(int х, int y, int z) {

super(x, y);

this.z = z;

}

double distance(int х, int y, int z) { int dx = this.x - х;

int dy = this.y - y; int dz = this.z - z;

return Math.sqrt(dx*dx + dy*dy + dz*dz);

}

double distance(Point3D other) {

return distance(other.х, other.y, other.z);

}

double distance(int х, int y) {

double dx = (this.x / z) - х;

double dy = (this.у / z) - y;

return Math.sqrt(dx*dx + dy*dy);

}

}

class Point3DDist {

public static void main(String args[]) { Point3D p1 = new Point3D(30, 40, 10);

Point3D p2 = new Point3D(0, 0, 0);

Point p = new Point(4, 6);

System.out.println("p1 = " + p1.x + ", " + p1.y + ", " + p1.z);

System.out.println("p2 = " + p2.x + ", " + p2.y + ", " + p2.z);

System.out.println("p = " + p.x + ", " + p.y); System.out.println("p1.distance(p2) = " + p1.distance(p2)); System.out.println("p1.distance(4, 6) = " + p1.distance(4, 6)); System.out.println("p1.distance(p) = " + p1.distance(p));

}

}

Ниже приводится результат работы этой программы:

p1 = 30, 40, 10 р2 = 0, 0, 0 р = 4, 6

p1.distance(p2) = 50.9902 p1.distance(4, 6) = 2.23607 p1.distance(p) = 2.23607

Обратите внимание — мы получили ожидаемое расстояние между трехмерными точками и между парой двумерных точек. В примере используется механизм, который называется динамическим назначением методов (dynamic method dispatch).

 


Поделиться:

Дата добавления: 2015-09-15; просмотров: 109; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты