Добавил:
ИВТ (советую зайти в "Несортированное") Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
23.11.2024
Размер:
111.62 Кб
Скачать

Конструкторы класса

Конструкторы это специальные методы с именем, совпадающим с именем класса, вызываемые при создании класса оператором new. Конструкторы позволяют выполнить код инициализации класса, устанавливающий все необходимые начальные значения свойств класса. Как и методы конструкторы могут принимать аргументы.

Пример описания конструкторов класса Test

//конструктор без параметра — устанавливает значение свойства Temp

Test() {

this.Temp = “”;

}

//конструктор с параметром — устанавливает значение свойства Temp

Test(String s) {

setTemp(String s);

}

Как видно из примера, в классе могут присутствовать несколько конструкторов с одинаковыми именами, но разными аргументами. Это называется перегрузкой конструкторов и подробнее рассматривается в главе «Полиморфизм. Перегрузка и переопределение методов и конструкторов».

Полиморфизм. Перегрузка и переопределение методов и конструкторов

Полиморфизм означает возможность применения одноименных методов с одинаковыми или различными наборами параметров в одном классе или в группе классов, связанных отношением наследования. Понятие полиморфизма, в свою очередь, опирается на два других понятия: совместное использование overloading (перегрузку, доопределение, совместное использование) и переопределение overriding.

В языке Java каждый метод обладает определенной сигнатурой, которая представляет собой совокупность имени с количеством и типом параметров. Два метода могут иметь одинаковые имена, если их сигнатуры отличаются по количеству или типам параметров. Это называется перегрузкой (overloading), поскольку простое имя метода “перегружается” несколькими значениями. Когда программист вызывает метод, компилятор по количеству и типу параметров ищет тот из существующих методов, сигнатура которого подходит лучше всех остальных. Тип возвращаемого значения не является определяющим фактором при совместном использовании — при вызове метода транслятору нужно определить, какой из одноименных методов вызывать, а тип возвращаемого значения, в общем случае, не позволяет сделать это однозначно. Поэтому нельзя описать в рамках одного класса два метода с одинаковым набором параметров и разными типами возвращаемых значений. Это статический полиморфизм методов классов.

В Java (как и в других объектно-ориентрованных языках) выполняется вызов метода данного объекта с учетом того, что объект может быть не того же класса, что и ссылка, указывающая на него. Т.е. выполняется вызов метода того класса, к которому реально относится объект. Это динамический полиморфизм методов. Он называется поздним связыванием (dynamic binding, late binding, run-time binding). В C++ соответствующий механизм называется механизмом виртуальных функций.

Статические члены класса

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

Для статического члена создается всего один экземпляр, общий для всего класса, вместо построения его копий в каждом объекте класса. В случае статических переменных (переменных класса), это ровно одна переменная, независимо от того, сколько объектов было создано на основе класса (даже если ни одного).

Класс также может содержать блоки статической инициализации, которые присваивают значения статическим полям или выполняют иную необходимую работу. Статический инициализатор оказывается наиболее полезным в тех случаях, когда простой инициализации в объявлении поля недостаточно. Например, создание статического массива часто должно выполняться одновременно с его инициализацией в операторах программы. Приведем пример инициализации небольшого массива с простыми числами:

class Numbers {

protected static int[] knownNumbers = new int[4];

static {

knownNumbers [0] = 2;

for(int i = 1; i < knownNumbers.length; i++)

knownNumbers [i] = nextNumbers();

}

}

Как было сказано выше, в классе могут присутствовать статические поля, относящиеся к классу в целом, а не к его конкретным экземплярам. По аналогии с ними могут существовать и статические методы, также относящиеся ко всему классу, которые часто называют методами класса. Статические методы обычно предназначаются для выполнения операций, специфичных для данного класса, и работают со статическими полями, а не с конкретными экземплярами класса. Для объявления таких методов также используется ключевое слово static.

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

Статический метод не может напрямую обращаться к не статическим членам. При вызове статического метода не существует ссылки на конкретный объект, для которого вызывается данный метод. Это ограничение можно обойти, передавая ссылку на конкретный объект в качестве параметра статического метода. Тем не менее, в общем случае статические методы выполняют свои функции на уровне всего класса, а нестатические методы работают с конкретными объектами. Статический метод, модифицирующий поля объектов, — примерно то же самое, что фабрика по производству определенного товара, пытающаяся изменить серийный номер давно проданного экземпляра.

Рассмотрим пример:

public class Point {

private static String destinaton;

static {

destinaton = "Плоскость";

}

private double x = 0;

private double y;

// Конструктор по умолчанию (без параметров)

public Point() {

y = 5;

}

// Переопределенный конструктор (overloading), принимающий 2 параметра x и y

public Point(double x, double y) {

this.x = x;

this.y = y;

}

//реализуем 2 метода для получения и установки значения переменной x

//(реализуем инкапсуляцию)

public double GetX() {

return x;

}

public void SetX(double x) {

this.x = x;

}

public double GetY() {

return y;

}

public void SetY(double y) {

this.y = y;

}

//2 статич. метода для получения и установки значения статической переменной

public static String GetDestination() {

return destinaton;

}

public static void SetDestination(String _destination) {

destinaton = _destination;

}

}

public class Example {

public static void main(String[] args) {

/*

создадим новый объект класса, используя конструктор по умолчанию

и выведем на экран значения переменных

*/

Point p1 = new Point();

System.out.println(p1.GetX());

System.out.println(p1.GetY());

System.out.println(p1.GetDestination());

System.out.println();

/*

изменим значение переменной x, используя метод SetX

и выведем обновленные значения на экран

*/

p1.SetX(0.5);

System.out.println(p1.GetX());

System.out.println(p1.GetY());

System.out.println(p1.GetDestination());

System.out.println();

/*

создадим новую переменную типа Point, используя конструктор с параметрами

*/

Point p2 = new Point(10, 10);

System.out.println(p2.GetX());

System.out.println(p2.GetY());

System.out.println(p2.GetDestination());

System.out.println();

// изменим значение статической переменной

p2.SetDestination("сфера");

/*

выведем значения статического поля для каждой из переменных

(будут одинаковы)

*/

System.out.println(p1.GetDestination());

System.out.println(p2.GetDestination());

}

}