Чтобы работать с объектами, их нужно сначала создать и задать исходное состояние. Затем к этим объектам применяются методы. В языке Java для создания новых экземпляров используются конструкторы. Конструктор – специальный метод, предназначенный для создания и инициализации экземпляра класса. Имя конструктора всегда совпадает с именем класса. Следовательно, конструктор класса Employee называется Employee и объявляется как
public Employee(String n, double s, int year, int month, int day){ name=n;
salary=s;
hiredate=(new GregorianCalendar(year,month-1,day)).getTime();
}
В одном классе может быть объявлено несколько конструкторов, если их сигнатуры разные. Например, можно создать конструктор в классе Employee, который принимает только имя сотрудника и устанавливает ему заработную плату 1 условная единица. Дата выхода на работу всем таким сотрудникам будет установлена 31 декабря 2009 года.
public Employee(String n){
name=n;
salary=1;
hiredate=(new GregorianCalendar(2009,12,31)).getTime();
}
Для создания объекта необходимо объявить объектную переменную, затем вызвать конструктор класса. Например, объявим две переменные e1 и e2 с типом Employee. Создадим двух сотрудников в информационной системе с помощью вызова различных конструкторов.
Employee e1 = new Employee(“James Bond”, 100000, 1950,1,1); Employee e2 = new Employee(“James NeBond”);
В результате вызова конструкторов сотрудник James Bond был принят на работу 1 января 1950 года с заработной платой 100000 у.е. (ссылка на объект сохранена в объектной переменной e1), сотрудник James NeBond был принят на работу 31 декабря 2009 года с заработной платой 1 у.е. (ссылка на объект сохранена в объектной переменной e2), т.к. для его создания использовался второй конструктор, который принимает одно-единственное значение.
1.3. Основные понятия ООП – инкапсуляция, наследование и полиморфизм
Наследование (inheritance) - это отношение между классами, при котором класс использует структуру или поведение другого (одиночное наследование) или других (множественное наследование) классов. Наследование вводит иерархию "общее/частное", в которой подкласс наследует от одного или нескольких более общих суперклассов. Подклассы обычно дополняют или переопределяют унаследованную структуру и поведение.
Расширим класс Employee следующим образом. Необходимо описать класс, экземпляры которого представляли бы менеджера предприятия. Менеджер является таким же сотрудником, однако у него есть дополнительное поле – премия. Соответственно, метод, который возвращал в классе сотрудник Employee размер заработной платы, больше не подходит для менеджера.
class Manager extends Employee{ //наследование от класса //сотрудник
private double bonus; // размер премии конструктор класса
public Manager (String n, double s, int year, int month, int day){
super(n, s, year, month, day); // т.к. класс унаследован от другого
//класса, то первой командой в конструкторе класса-потомка
//необходимо вызвать конструктор родителя. Т.к. в скобках после
//super указано 5 аргументов, то будет вызван первый конструктор
//Employee
}}
Теперь каждый экземпляр класса Manager имеет 4 поля – name, salary, hiredate, bonus. Определяя подкласс, нужно указать лишь отличия между подклассом (потомком) и суперклассом (родителем). Разрабатывая классы, следует помещать методы общего назначения в суперкласс, а более специальные – в подкласс.
В приведенном выше примере не все методы родительского класса Employee подходят для класса Manager. В частности, метод getSalary() должен возвращать сумму базовой зарплаты и премии. Следовательно, нужно реализовать новый метод, замещающий (overriding) метод класса родителя. Сделать это можно следующим образом:
class Manager extends Employee{
….
public void getSalary() {новое тело метода….} // перекрытие (замещение)//метода класса родителя
….
}
Новый (замещенный) метод будет выглядеть так:
public void getSalary(){
double basesalary=super.getSalary();
return basesalary+bonus;
}
Инкапсуляция (encapsulation) - это сокрытие реализации класса и отделение его внутреннего представления от внешнего (интерфейса). При использовании объектно-ориентированного подхода не принято использовать прямой доступ к свойствам какого-либо класса из методов других классов. Для доступа к свойствам класса принято использовать специальные методы этого класса для получения и изменения его свойств.
Открытые члены класса составляют внешний интерфейс объекта. Эта та функциональность, которая доступна другим классам. Закрытыми обычно объявляются все свойства класса, а так же вспомогательные методы, которые являются деталями реализации и от которых не должны зависеть другие части системы. Благодаря сокрытию реализации за внешним интерфейсом класса можно менять внутреннюю логику отдельного класса, не меняя код остальных компонентов системы.
Полиморфизм (polymorphism) - положение теории типов, согласно которому имена (например, переменных) могут обозначать объекты разных (но имеющих общего родителя) классов. Следовательно, любой объект, обозначаемый полиморфным именем, может по-своему реагировать на некий общий набор операций.






