Основы программирования на Java - страница 14
>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);
>}
>}
Язык 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. Недопустимо объявлять в классе методы с одинаковыми именами и сигнатурами. В сигнатуре метода не учитываются имена формальных параметров, учитываются лишь их типы и количество.
Очередной вариант класса 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
Основным фундаментальным свойством объектно-ориентированного подхода является наследование. Классы-потомки имеют возможность не только создавать свои собственные переменные и методы, но и наследовать переменные и методы классов-предков. Классы-потомки принято называть подклассами. Непосредственного предка данного класса называют его суперклассом. В очередном примере показано, как расширить класс 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.
В примере с классом Point3D частично повторялся код, уже имевшийся в суперклассе. Вспомните, как во втором конструкторе мы использовали