Технологии программирования
Лекция 3. Основы ООП (Объектно-ориентированное программирование) в Java
Объектно-ориентированное программирование (ООП) - это методология разработки программного обеспечения, основанная на представлении программы в виде совокупности объектов, каждый из которых имеет свое состояние и поведение. ООП позволяет упростить разработку, поддержку и повторное использование кода, а также улучшает читаемость и структурированность программ.
Java - это объектно-ориентированный язык программирования, основанный на классах, инкапсуляции, наследовании и полиморфизме. Он обеспечивает строгую типизацию, автоматическое управление памятью и сборщик мусора для освобождения памяти от неиспользуемых объектов.
Синтаксис класса
В Java класс представляет собой шаблон для создания объектов. Синтаксис класса выглядит следующим образом:
public class ClassName { }
Здесь public указывает, что любой класс в Java по умолчанию является закрытым, но его можно сделать открытым, если добавить модификатор доступа.
Далее идет имя класса, которое должно быть уникальным и не может быть ключевым словом Java или каким-либо специальным символом. Внутри фигурных скобок { } находится тело класса, где и определяются все его члены: поля, методы, конструкторы, геттеры/сеттеры, статические блоки и т.д.
Поле класса
Поле класса - это переменная, которая хранится в памяти компьютера и используется для хранения данных объекта. Поля класса могут быть разных типов, например, int, double, String и другие. Поля класса могут использоваться для хранения информации о объекте, например, имя, возраст, адрес и т.д.
Методы
Метод в Java состоит из двух частей: сигнатуры и тела метода. Сигнатура метода определяет имя метода, его параметры и возвращаемый тип, в то время как тело метода содержит код, который будет выполняться при вызове метода.
Вот пример метода с именем “add” который принимает два параметра (x и y) и возвращает их сумму:
public int add(int x, int y) {
return x + y;
}
Конструкторы класса
Конструкторы в Java используются для инициализации объектов при их создании. Они имеют то же имя, что и класс, и не могут возвращать значение. Если не определить конструктор явно, компилятор создаст конструктор по умолчанию, который принимает нулевые значения для всех аргументов.
При использовании конструктора можно задать значения для полей класса, используя ключевое слово “this”. Например:
public class Example {
int a;
int b;
Example(int a, int b) {
this.a = a;
this.b = b;
}
}
В данном примере конструктор принимает два аргумента (a и b) и присваивает их полям с теми же именами.
Также в Java можно определить несколько конструкторов для одного класса, каждый из которых может иметь свою сигнатуру и набор параметров. Например:
public class Example {
public int a;
public int b;
// Дефолтный конструктор
Example() {
}
// Конструктор с одним аргументом
Example(int a) {
this.a = a;
}
// Конструктор с тремя аргументами
Example(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
}
Дефолтный конструктор - это конструктор без параметров, который создается автоматически, если не написать ни одного конструктора. Он используется, когда нужно создать объект без передачи аргументов конструктору.
Его можно не писать, если вы явно определяете другой конструктор для класса. Однако, если вы не определяете ни одного конструктора, то компилятор Java создаст дефолтный конструктор для вас.
Вот пример использования конструктора для создания объекта класса Example:
class Temp {
public static void main(String[] args) {
Example example = new Example(5, 10);
System.out.println(example.a + " " + example.b);
}
}
Этот код создает объект example класса Example с аргументами 5 и 10 для полей a и b соответственно. Затем он выводит значения этих полей на консоль.
Ключевое слово this
Ключевое слово this используется для ссылки на текущий экземпляр класса. Мы используем ключевое слово this в тех случаях, когда нам нужно обратиться к полю класса, имея при этом доступ к локальной переменной с тем же именем.
Например:
private String name;
public void someMethod(String name) {
this.name = "defaultName";
}
Здесь мы внутри метода someMethod меняем поле name, а не локальную переменную name, которую мы приняли в качестве аргумента. Без использования ключевого this мы бы меняли локальную переменную, а не поле.
Модификаторы доступа
Модификаторы доступа в Java используются для управления видимостью членов класса. Всего существует четыре уровня доступа:
– private - член класса доступен только внутри этого класса. – protected - член доступен внутри класса и его наследников. – public - член доступен везде. – без указания модификатора (по умолчанию) - член класса не доступен за пределами пакета, в котором находится класс.
Использование модификаторов доступа позволяет контролировать доступ к членам класса и предотвращать возможные ошибки, связанные с нарушением инкапсуляции.
Статические переменные и статические методы
Статические методы и переменные в Java доступны без создания экземпляра класса. Т.е. к ним можно обратиться просто по имени класса. Они также могут быть использованы в других статических методах и переменных. Статические методы не имеют доступ к нестатическим переменным и методам, т.к. те принадлежат конкретному экземпляру класса.
Пример статического метода:
public class Example {
public static void method() {
System.out.println("Static method executed.");
}
}
Метод method() может быть вызван без создания экземпляра класса:
Example.method();
Пример статической переменной:
public class Example {
private static int count = 0;
// Другие поля и методы класса
}
Статическая переменная count может быть изменена и получена без создания экземпляра класса:
int value = Example.count;
System.out.println("Value of static variable: " + value);
Пример с лекции
Класс Student в Java может быть определен следующим образом:
public class Student {
private String fio;
private double middleMark;
private int groupNumber;
public Student(String fio, double middleMark, int groupNumber) {
this.fio = fio;
this.middleMark = middleMark;
this.groupNumber = groupNumber;
}
// Getters and setters for the fields
public void setFio(String fio) { this.fio = fio; }
public String getFio() { return fio; }
public double getMiddleMark() { return middleMark; }
public int getGroupNumber() { return groupNumber; }
}
Здесь мы создали класс Student, который имеет три поля: fio (фамилия и имя студента), middleMark (средний балл студента) и groupNumber (номер группы студента). Конструктор класса принимает значения этих полей и устанавливает их для экземпляра класса. Кроме того, мы определили геттеры и сеттеры для каждого поля.
Пример использования класса Student:
class Example{
public static void main(String[] args) {
Student student1 = new Student("Иванов Иван", 4.6, 101);
Student student2 = new Student("Петров Петр", 3.8, 102);
System.out.println("Student 1: " + student1.getFio() + ", group " +
student1.getGroupNumber() + ", middle mark " + student1.getMiddleMark());
System.out.println("Student 2: " + student2.getFio() + ", group " +
student2.getGroupNumber() + ", middle mark " + student2.getMiddleMark());
}
}
В этом примере мы создаем два экземпляра класса Student и выводим информацию о каждом из них.