Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как реализованы принципы ООП в Java
Java — это язык с полной поддержкой объектно-ориентированного программирования. Все четыре основных принципа ООП реализованы на уровне языка и его синтаксиса.
1. Инкапсуляция (Encapsulation)
Суть: Скрытие внутренней реализации и предоставление контролируемого доступа к данным.
public class BankAccount {
// private — скрывает внутренние данные
private double balance;
private String accountNumber;
// public — контролируемый доступ через методы
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
logTransaction("Deposit", amount);
}
}
public boolean withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
logTransaction("Withdrawal", amount);
return true;
}
return false;
}
public double getBalance() {
return balance; // Только чтение
}
private void logTransaction(String type, double amount) {
// private метод — деталь реализации
}
}
// Преимущества:
// 1. balance защищена от прямого доступа
// 2. Валидация через deposit/withdraw
// 3. Логирование скрыто внутри
// 4. Можем менять реализацию без изменения API
Уровни доступа в Java:
public class AccessLevels {
public int publicVar; // Видно везде
protected int protectedVar; // В пакете и наследники
int packageVar; // Только в пакете (default)
private int privateVar; // Только в классе
}
2. Наследование (Inheritance)
Суть: Класс может наследовать свойства и методы другого класса.
// Базовый класс
public class Animal {
protected String name;
protected int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void eat() {
System.out.println(name + " is eating");
}
public void sleep() {
System.out.println(name + " is sleeping");
}
}
// Наследующий класс
public class Dog extends Animal {
private String breed;
public Dog(String name, int age, String breed) {
super(name, age); // Вызов конструктора базового класса
this.breed = breed;
}
// Переопределение (Override)
@Override
public void eat() {
System.out.println(name + " is eating dog food");
}
// Новый метод
public void bark() {
System.out.println(name + " is barking");
}
}
// Использование
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Rex", 5, "Labrador");
dog.eat(); // Вызовет переопределённый метод
dog.sleep(); // Наследованный метод
dog.bark(); // Новый метод
}
}
Иерархия наследования:
public class Vehicle {
public void start() {}
}
public class Car extends Vehicle {
public void openTrunk() {}
}
public class SportsCar extends Car {
public void activateTurbo() {}
}
// SportsCar наследует методы из Car и Vehicle
3. Полиморфизм (Polymorphism)
Суть: Один интерфейс, много реализаций.
3.1 Полиморфизм через методы (Method Overriding)
public class PaymentProcessor {
public void process(Payment payment) {
payment.execute(); // Вызовет нужную реализацию
}
}
public interface Payment {
void execute();
}
public class CreditCardPayment implements Payment {
@Override
public void execute() {
System.out.println("Processing credit card...");
}
}
public class PayPalPayment implements Payment {
@Override
public void execute() {
System.out.println("Processing PayPal...");
}
}
public class CryptoCurrencyPayment implements Payment {
@Override
public void execute() {
System.out.println("Processing cryptocurrency...");
}
}
// Использование
public class Main {
public static void main(String[] args) {
PaymentProcessor processor = new PaymentProcessor();
processor.process(new CreditCardPayment()); // Выполнит свою реализацию
processor.process(new PayPalPayment()); // Выполнит свою реализацию
processor.process(new CryptoCurrencyPayment()); // Выполнит свою реализацию
}
}
// Преимущество: processor не знает о конкретных реализациях
3.2 Полиморфизм через операторы (Method Overloading)
public class Calculator {
// Один метод с разными сигнатурами
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public String add(String a, String b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
// Использование
Calculator calc = new Calculator();
System.out.println(calc.add(5, 3)); // 8
System.out.println(calc.add(5.5, 3.2)); // 8.7
System.out.println(calc.add("Hello", "World")); // HelloWorld
System.out.println(calc.add(5, 3, 2)); // 10
3.3 Ковариантность типов (Covariance)
public class Shape {
public void draw() {}
}
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("Drawing circle");
}
}
public class ShapeFactory {
public Shape createShape() {
return new Shape();
}
}
public class CircleFactory extends ShapeFactory {
@Override
public Circle createShape() { // Можем вернуть подтип
return new Circle();
}
}
4. Абстракция (Abstraction)
Суть: Скрытие сложности и предоставление простого интерфейса.
4.1 Abstract классы
public abstract class DatabaseConnection {
// Абстрактные методы — определяют контракт
public abstract void connect();
public abstract void disconnect();
public abstract void executeQuery(String query);
// Конкретный метод
public void reconnect() {
disconnect();
connect();
}
}
public class MySQLConnection extends DatabaseConnection {
@Override
public void connect() {
System.out.println("Connecting to MySQL...");
}
@Override
public void disconnect() {
System.out.println("Disconnecting from MySQL...");
}
@Override
public void executeQuery(String query) {
System.out.println("Executing: " + query);
}
}
// Использование
public class Application {
public static void main(String[] args) {
DatabaseConnection db = new MySQLConnection();
db.connect();
db.executeQuery("SELECT * FROM users");
db.reconnect(); // Использует конкретные методы
db.disconnect();
}
}
4.2 Интерфейсы
public interface Logger {
void log(String message);
void error(String message);
}
public interface Notifier {
void sendNotification(String message);
}
// Класс может реализовать несколько интерфейсов
public class EmailLogger implements Logger, Notifier {
@Override
public void log(String message) {
System.out.println("Log: " + message);
}
@Override
public void error(String message) {
System.err.println("Error: " + message);
}
@Override
public void sendNotification(String message) {
System.out.println("Email: " + message);
}
}
5. Практический пример: Все принципы вместе
// Абстракция: интерфейс определяет контракт
public interface NotificationService {
void send(String message);
}
// Инкапсуляция: скрываем реальность
public class EmailService implements NotificationService {
private String smtpServer; // private
private int port; // private
public EmailService(String server, int port) {
this.smtpServer = server;
this.port = port;
}
@Override
public void send(String message) {
validate(message); // приватный метод
connectToServer(); // приватный метод
sendViaSmtp(message); // приватный метод
}
private void validate(String message) {}
private void connectToServer() {}
private void sendViaSmtp(String message) {}
}
// Полиморфизм: разные реализации
public class SMSService implements NotificationService {
@Override
public void send(String message) {
System.out.println("Sending SMS");
}
}
// Наследование: расширение функциональности
public class PriorityEmailService extends EmailService {
private int priority;
public PriorityEmailService(String server, int port, int priority) {
super(server, port);
this.priority = priority;
}
}
// Использование: полиморфизм позволяет работать с абстракцией
public class NotificationManager {
private List<NotificationService> services = new ArrayList<>();
public void addService(NotificationService service) {
services.add(service);
}
public void notifyAll(String message) {
for (NotificationService service : services) {
service.send(message); // Полиморфизм
}
}
}
В итоге: Java имеет полную встроенную поддержку всех ООП принципов — инкапсуляция через модификаторы доступа, наследование через extends, полиморфизм через переопределение методов и интерфейсы, абстракция через abstract классы и интерфейсы. Эти принципы работают вместе, создавая гибкий и масштабируемый код.