Классы в java
Классы — это основная конструкция объектно-ориентированного программирования. Классы позволяют создавать объекты структурного типа, обладающих своим набором полей, констант, методов, а также наделяют объекты конструкторами. Классы выступают шаблонами для создания объектов своего типа.
Любая программа в Java может быть описана как набор взаимодействующих с собой объектов различного предназначения. ООП облегчает написание программ, позволяя делать ассоциации объектов с объектами реального мира.
Что представляют собой объекты
Прежде, чем раскрывать понятие и назначение класса, следует понять, что представляет собой объект в программировании. В реальной жизни объектом является все, что нас окружает: человек, автомобиль, дом, дерево, самолет, чайник, животное и многое другое. Возьмем чайник, как объект для дальнейшего раскрытия этого понятия.
Чайник обладает такими свойствами как: размер, вес, потребляемая мощность, литраж, цвет. Он выполняет такие функции как включение, кипячение, индикацию, выключение. В программировании нам не нужно рисовать чайник для создания объекта.
Как раз объекты в ООП представляют собой структуру, которая содержит свойства воображаемого объекта (поля), которые и выражают тот самый цвет, вес, размер и так далее. Функции объекта (методы) описывают функциональность объекта: включение индикация, кипячение и т. п.
Конструкторы объектов необходимы для создания большого количества объектов и являются однострочной инструкцией. Конструктор является обычной функцией с параметрами, которые задают определенные свойства создаваемому объекту. Однако на каком же основании создаются эти объекты? Где описываются все эти свойства — может быть это функция? Нет, это не функция. В ООП за описание объектов отвечают классы. Вот мы и подошли к ключевому понятию ООП — class.
Что представляют собой классы
Ранее было упомянуто, что класс — это шаблон, по которому создаются объекты. Так и есть! Однако класс — это еще и тип, к которому относятся объекты. Классы описывают свойства объектов в виде полей — переменных класса. Функциями объектов являются методы — те же пользовательские функции, но работающие в рамках объекта.
Поля могут быть инициализированы в классе, а могут быть инициализированы при создании объекта через параметры конструктора. Конструктор позволяет создавать объекты с разными и одинаковыми свойствами. Рассмотрим на примере создание класса.
Создадим класс, описывающий свойства чайника:
classKettle{ // Объявление класса и его имени
public String color = «black»; // поля как свойство
public float weight = 0.500;
publicint power = 2;
}
Мы описали шаблон для создания объектов с определенным набором свойств. Этот класс обладает ограниченным функционалом, поэтому он способен создать только одинаковые объекты с одним и тем-же набором свойств.
Создадим объект класса Kettle:
KettleblackKettle = newKettle(); // был создан объект чайника
System.out.println(blackKettle.color+» «+blackKettle.weight+» «+blackKettle.power); // Вывод: black 0.500 2
Обратите внимание, нельзя просто взять и обратить с свойство как к обычной переменной. Это осуществляется только через имя объекта или класса (если поле статическое). То есть, если обратиться к полю только по его имени «System.out.println(weight);», то возникнет ошибка.
Методы объектов
Методы объектов — это функции, которые описываются в классе и присваиваются объектам. Благодаря методам, объекты обретают определенный функционал. Также, как и поля, методы вызываются через имя объекта, или имя класса, если метод статический.
Возьмем наш чайник и расширим его возможности добавлением метода:
class Kettle{
public String color = «red»;
public float weight = 0.500;
publicint power = 2;public void show_info(){
System.out.println(this.color); // this выражаеттекущийобъект
System.out.println(this.weight);
System.out.println(this.power);
}
}KettleredKettle = newKettle(); // Создаем новый объект красного чайника
redKettle.show_info(); // Выведет: red 0.500 2
Поля и методы инкапсулируются в классы и объекты. Таким образом мы скрываем их из глобального контекста. У каждого класса свои поля,а каждый объект берет поля и методы своего класса.
В примерах выше мы создавали одинаковые объекты. Теперь пришло время разобраться с понятием конструктор.
Конструкторы в классах
Конструкторы представляют собой обычный метод. Но служит он для настройки свойств объекта и его создание. Конструктор в классе может быть один или несколько, все зависит от того, насколько гибкий требуется механизм для создания объектов.
Пример создания чайника с конструктором:
class Kettle{
public String color = «red»;
public float weight = 0.500;
publicint power = 2;public void show_info(){
System.out.println(this.color);
System.out.println(this.weight);
System.out.println(this.power);
}Kettle(String c, float w, int p){ // Определяем конструктор объекта. Имя конструктора всегда соответствует имени класса, в котором он определен
this.color = c;
this.weight = w;
this.power = p;
}
}//Здесь параметры конструктора задаются при создании объекта. Это позволяет создавать объекты с отличимыми свойствами
// Теперь создадим несколько объектов с разными свойствамиKettle redKettle = new Kettle(«red», 0.500, 4);
Kettle greenKettle = new Kettle(«green», 0.700, 5);
Kettle blackKettle = new Kettle(«black», 0.400, 2);redKettle.show_info(); // Выведет: red 0.500 4
greenKettle.show_info(); // Выведет: green 0.700 5
blackKettle.show_info(); // Выведет: black 0.400 2
Можно в одном классе осуществить перегрузку конструкторов — определить несколько конструкторов, которые будут отличаться по количеству параметров. В разных конструкторах можно определить разные инструкции. Все конструкторы должны быть с одинаковым именем, но с разным количеством или типом параметров. При вызове конструктора, сработает тот, который соответствует количеству и типу параметров, с которыми его вызвали.
Пример:
class Kettle{
public String color = «red»;
public float weight = 0.500;
publicint power = 2;public void show_info(){
System.out.println(this.color);
System.out.println(this.weight);
System.out.println(this.power);
}Kettle(String c, float w, int p){ // Первый конструктор
this.color = c;
this.weight = w;
this.power = p;
}Kettle(String c){ // Второй конструктор
this.color = c;
}Kettle(String c, float w){ // Третий конструктор
this.color = c;
this.weight = w;
}
}
Мы создали три конструктора, каждый из которых отличается количеством параметров и инструкций. Создавать объекты можно любым из 3-х конструкторов. Если выбрать конструктор, где устанавливаются не все свойства объекту, то остальные, которые не задаются конструктором останутся со значениями по умолчанию, которые были определены в классе.
Создадим объект:
KettlesomeKettle = newKettle(«grey», 0.600); // Был вызван третий конструктор по количеству параметров
someKettle.show_info(); // Третье свойство осталось по умолчанию. Вывод: grey 0.600 2
Каждый раз, когда мы создаем объекты, они получают все свойства класса и его методы. Если значения свойств небыли установлены в конструкторе, то значения присваиваются по умолчанию или совсем могут отсутствовать.
Модификаторы, определяющие назначение класса
Ранее мы создавали и описывали простой класс. Однако это не единственный вид классов в java. В дополнении к простым классам существуют еще и абстрактные. Абстрактный класс обладает модификатором abstract. Он похож на обычный класс. Однако отличается тем, что не позволяет создавать объекты. Абстрактный класс является шаблоном для наследования своего функционала другими классами.
Пример объявления абстрактного класса и наследования от него:
public abstract class Kettle{
public String color;
public float weight;
publicint power;public void show_info(){
System.out.println(this.color);
System.out.println(this.weight);
System.out.println(this.power);
}publicvoidabstractwrite_mes(); // Абстрактный метод, который должны реализовать потомки
}
Выше был объявлен абстрактный класс, поля которого небыли инициализированы. Это и не нужно, так как инициализироваться они будут у классов наследников.
Пример наследования:
classMini_kettle extends Kettle{
// данный класс копирует поля и методы абстрактного классаpublicvoidwrite_mes(){ // Обязательная реализация абстрактного метода предка — метод получает индивидуальные или одинаковые операторы в разных классах
Systen.out.println(«Boil is finish»);
}
}
Условия для создания абстрактных классов:
- Абстрактные классы не создают объекты, но наследуют свои псевдоклассы.
- Псевдоклассы получают все поля и методы абстрактного класса, а также обязаны реализовать его абстрактные методы по-разному или одинаково.
- Если в классе есть хоть одно абстрактное поле или метод, то класс автоматически становится абстрактным.
- В абстрактном классе нельзя объявлять конструкторы.
Абстрактные классы значительно сокращают время на написание программы. Наследование, прописанное в одну строчку, копирует весь функционал потомка в наследника — поля и методы не нужно переписывать, за исключением тех, у которых стоит модификатор abstract.
Объекты, создаваемые потомками, получают все от абстрактного класса и своего родителя. Если простыми словами, то абстрактный класс является шаблоном для реализации логически связанных классов.
Статические поля и методы
В классе могут содержаться поля и методы с модификатором static. Такие элементы не являются экземпляром объекта. Статические элементы вызываются через имя класса, а не объекта. Литералы таких полей сохраняются в классе. При создании новых объектов они не меняются.
Пример:
class Kettle{
public String color = «red»;
public float weight = 0.500;
publicint power = 2;staticvoidshow_info(){ // Статический метод, убираем this, так как данные для вывода берутся по умолчанию, а не из объекта
System.out.println(color);
System.out.println(weight);
System.out.println(power);
}Kettle(String c, float w, int p){ // Первый конструктор
this.color = c;
this.weight = w;
this.power = p;
}
}
Kettle k = new Kettle(«yellow», 0.500, 3);
k.show_mes(); // Компилятор выдаст ошибку, так как статический метод не является экземпляром объекта
Kettle.show_mes(); // Выведены данные из класса: red 0.500 2
Подведем итоге и вкратце повторим предназначение классов
- Класс описывает свойства и методы обработки своих данных, ассоциируясь с предметами окружающей среды.
- Классы инкапсулируют и объекты в себя переменные(поля/свойства) и функции(методы).
- Классы обладают функцией конструктором, которая создает объекты класса.
- Параметры конструктора могут задавать разные свойства для объектов.
- При создании объекта, все его свойства обновляются либо за счет параметров, либо им присваиваются данные, инициализированные в классе.
- Классы могут быть обычными и абстрактными.
- Абстрактные классы являются паттерном, описывающим наличие полей и методов, которые должны содержать потомки.
- Простые классы наследуют абстрактный простой конструкцией classChildextendsParent{}.
- Класс потомок при наследовании получает весь функционал класса родителя.
- Абстрактные поля и методы переписываются в потомках.
- Статические методы и поля не являются экземплярами объектов, но хранят информацию о классе.