Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
java / Java_Intro1_220509.pdf
Скачиваний:
260
Добавлен:
11.05.2015
Размер:
1.71 Mб
Скачать

Конструкторов в классе может быть несколько, и поскольку все они имеют одинаковые имена (имена класса), то должны различаться типом или количеством параметров.

Создать экземпляр класса можно используя зарезервированное слово new. Оно используется для выделения памяти объектам и массивам.

TenthGrade A = new TenthGrade();

TenthGrade B = new TenthGrade();

В данном примере представлено создание двух экземпляров класса TenthGrade (Десятые классы). В качестве операнда new указывается конструктор TenthGrade(). В результате создается две ссылки A и B на созданные объекты, то есть на объекты класса TenthGrade. Можно непосредственно использовать операнд new:

New TenthGrade().homework();

Здесь создается безымянный объект класса TenthGrade и сразу же после его создания выполняется метод homework().

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

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

class Point{ int a,b;

Point(int a, int b){ this.a=a; this.b=b;

}

Point(){

a=0;

b=0;

}

class MPoins{

public static void main(string[] args){ Point p1 = new Point();

Point p2 = new Point(10,23);

System.out.println(“Коорд. 1 точки x=” + p1.x «y=» + p1.y); System.out.println(“Коорд. 2 точки x=” + p2.x «y=» + p2.y);

}

}

Решение о том, какой конструктор нужно вызвать в том или ином случае, принимается в соответствии с количеством и типом параметров указанных оператором new. Недопустимо в классе использовать методы с

одинаковыми параметрами и сигнатурами. В сигнатуре метода не учитывается имена прараметров, а только их тип и количество.

Ссылка this

Рассмотрим пример с использованием ссылки this во втором методе. В этом случае второй конструктор Point() для завершения инициализации объекта возращается к первому конструктору Point(int a, int b).

class Point{ int a,b;

Point(int a, int b){ this.a=a; this.b=b;

}

Point(){

this(0,0);

}

class MPoins{

public static void main(string[] args){ Point p1 = new Point(10,23);

Point p2 = new Point();

System.out.println(“Коорд. 1 точки x=” + p1.x «y=» + p1.y); System.out.println(“Коорд. 2 точки x=” + p2.x «y=» + p2.y);

}

}

Наследование

Одним из фундаментальных принципов объектно-ориентирован- ного программирования является наследование. Классы потомки имеют возможность не только создавать свои собственные переменные и методы, но и наследовать переменные и методы классов-предков. Непосредственного или прямого предка для выбранного класса мы будем называть суперклассом.

Пример. Путем применения механизма наследования расширяем класс Point c двухмерного до трехмерного (имеет 3-координаты).

class Point3 extends Point{ int c,

Point3(int a, int b, int c){ this.a=a;

this.b=b;

this.c=c;

}

Point3(){

this(0,0,0);

}

}

Ключевое слово extends в рассматриваемом примере выше используется для того, чтобы сообщить транслятору о номерении

создать подкласс класса Point. В классе Point3 нет необходимости создавать две переменные координаты, так как он их наследует от класса Point.

Ссылка super

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

Пример. Использование ключевого слова super. class Point3 extends Point{

int c,

Point3(int a, int b, int c){ super(a,b)

this.c=c;

}

public static void main(string[] args){ Point3 p1 = new Point3(10,23,71);

System.out.println(“Коорд. точки x=” + p1.a + «y=» + p1.b + «z=» + p1.c);

}

}

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

Рассмотрим подкласс Point3 класса Point, который будет наследовать реализацию метода distan своего суперкласса. В классе Point определен метод distan, который возращает расстояние на плоскости между двумя точками. Поскольку в подклассе Point3 мы переходим к рассмотрению трехмерного случая то необходимо заместить (override, англ. overriding - замещение) это определение новым. В примере так же показано и совмещение(overloading) метода distan.

Пример. class Point{

int a,b;

Point(int a, int b){ this.a=a; this.b=b;

}

double distan(int a, int b){ int da=this.a-a;

int db=this.b-b;

return Math.sqrt(da*da+db*db);

}

double distan(point p){ return distan(p.a, p.b);

}

class Point3 extends Point{ int c,

Point3(int a, int b, int c){ super(a,b)

this.c=c;

double distan(int a, int b, int c){ int da=this.a-a;

int db=this.b-b; int dc=this.c-c;

return Math.sqrt(da*da+db*db+dc*dc);

}

double distan(Point3 p){

return distan(p.a, p.b, p.c);

}

double distan(int a, int b){ int da=(this.a/c)-a; int db=(this.b/c)-b;

return Math.sqrt(da*da+db*db);

}

}

public static void main(string[] args){ Point3 p1 = new Point3(10,23,71);

System.out.println(“Коорд. точки x=” + p1.a + «y=» + p1.b + «z=» + p1.c);

}

}

Class Point3distan()

public static void main(string[] args){ Point3 p1 = new Point3(10,23,71); Point3 p2 = new Point3(0,0,0);

Point3 p3 = new Point(3,7);

System.out.println(“Коорд.1 точки x=” + p1.a + «y=» + p1.b + «z=» + p1.c);

System.out.println(“Коорд.2 точки x=” + p2.a + «y=» + p2.b + «z=» + p2.c);

System.out.println(“Коорд.3 точки x=” + p3.a + «y=» + p3.b); System.out.println(“p1.distan(p2)=” p1.distan(p2)); System.out.println(“p1.distan(4,6)=” p1.distan(4,6)); System.out.println(“p1.distan(p)=” p1.distan(p));

}

}

Таким образом мы получим расстояние между парой трехменых точек и два расстояния между точками на плоскости. В примере

используется механизм — динамическое назначение методов (dynamic method dispatch).

Динамическое назначение методов

В качестве примера рассмотрим два класса, у которых имеется простое родство типа подкласс/cуперкласс. Единственный метод суперкласса замещен в подклассе.

Class A { void callme()

System.out.println(“Вызван метод callme класса A»);

}

}

Class B extends A { void callme()

System.out.println(“Вызван метод callme класса B»);

}

}

Class Dispatch {

public static void main(string[] args){ A a = new B();

a.callme();

}

}

Рассмотренная форма динамического полиморфизма времени выполнения представляет один из наиболее мощных механизмов объектно-ориентированного программирования, позволяющих писать надежный, многократно используемый код.

Директива final Диструкторы Статистические методы Абстрактные классы

Соседние файлы в папке java