Найти в Дзене
JavaExplorers

Полиморфизм

Полиморфизм - это возможность объекта выступать в разных формах. Он позволяет одному методу или классу работать с объектами разных классов, при этом метод или класс будут работать одинаково с объектами разных классов. Примеры полиморфизма: 1. Полиморфизм методов. Разные классы могут иметь методы с одинаковыми именами и параметрами, но разной реализацией. Например, у нас есть классы Rectangle и Triangle, которые имеют метод calculateArea(), но реализуют его по-разному: public class Rectangle {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public double getWidth() {
return width;
}
public double getHeight() {
return height;
}
public double calculateArea() {
return width * height;
}
}
public class Triangle {
private double base;
private double height;
public Triangle(double base, double height) {

Полиморфизм - это возможность объекта выступать в разных формах. Он позволяет одному методу или классу работать с объектами разных классов, при этом метод или класс будут работать одинаково с объектами разных классов.

Примеры полиморфизма:

1. Полиморфизм методов. Разные классы могут иметь методы с одинаковыми именами и параметрами, но разной реализацией. Например, у нас есть классы Rectangle и Triangle, которые имеют метод calculateArea(), но реализуют его по-разному:

public class Rectangle {
private double width;
private double height;

public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}

public double getWidth() {
return width;
}

public double getHeight() {
return height;
}

public double calculateArea() {
return width * height;
}
}

public class Triangle {
private double base;
private double height;

public Triangle(double base, double height) {
this.base = base;
this.height = height;
}

public double getBase() {
return base;
}

public double getHeight() {
return height;
}

public double calculateArea() {
return 0.5 * base * height;
}
}

Теперь мы можем использовать эти методы для разных объектов, например:

Rectangle rectangle = new Rectangle(5, 10);
Triangle triangle = new Triangle(4, 8);

System.out.println("Area of rectangle: " + rectangle.calculateArea());
System.out.println("Area of triangle: " + triangle.calculateArea());


2. Полиморфизм аргументов. Полиморфизм аргументов возникает, когда метод может принимать различные типы аргументов, которые являются наследниками или реализуют один и тот же интерфейс. Благодаря полиморфизму аргументов, методы могут работать с объектами разных классов, что делает код более гибким и масштабируемым.

Рассмотрим пример. У нас есть классы Shape, Rectangle и Triangle, где Rectangle и Triangle являются наследниками класса Shape. Также у нас есть класс AreaPrinter, который печатает площадь фигуры:

public class Shape {
public double calculateArea() {
return 0;
}
}

public class Rectangle extends Shape {
private double width;
private double height;

public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}

public double getWidth() {
return width;
}

public double getHeight() {
return height;
}

@Override
public double calculateArea() {
return width * height;
}
}

public class Triangle extends Shape {
private double base;
private double height;

public Triangle(double base, double height) {
this.base = base;
this.height = height;
}

public double getBase() {
return base;
}

public double getHeight() {
return height;
}

@Override
public double calculateArea() {
return 0.5 * base * height;
}
}

public class AreaPrinter {
public void printArea(Shape shape) {
System.out.println("Area: " + shape.calculateArea());
}
}

Теперь мы можем создать объекты классов Rectangle и Triangle и передать их в метод printArea() объекта класса AreaPrinter:

Rectangle shape1 = new Rectangle(5, 10);
Triangle shape2 = new Triangle(4, 8);

AreaPrinter printer = new AreaPrinter();
printer.printArea(shape1);
printer.printArea(shape2);

Здесь мы создали объекты классов Rectangle и Triangle и передали их в метод printArea() объекта класса AreaPrinter. Этот метод принимает объекты типа Shape, которые являются родительским классом для классов Rectangle и Triangle. Благодаря полиморфизму аргументов, метод printArea() может работать с объектами разных классов.

3. Полиморфизм интерфейсов. Полиморфизм интерфейсов возникает, когда несколько классов реализуют один и тот же интерфейс, и мы можем использовать эти классы как объекты типа этого интерфейса. Благодаря полиморфизму интерфейсов, мы можем писать более абстрактный код, который может работать с объектами разных классов, реализующих один и тот же интерфейс.

Рассмотрим пример. У нас есть интерфейс Shape, который определяет метод calculateArea(), который должен быть реализован в классах, которые реализуют этот интерфейс:

public interface Shape {
double calculateArea();
}

Теперь мы можем создать классы, которые реализуют этот интерфейс. Например, классы Rectangle и Triangle:

public class Rectangle implements Shape {
private double width;
private double height;

public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}

@Override
public double calculateArea() {
return width * height;
}
}

public class Triangle implements Shape {
private double base;
private double height;

public Triangle(double base, double height) {
this.base = base;
this.height = height;
}

@Override
public double calculateArea() {
return 0.5 * base * height;
}
}

Теперь мы можем создать объекты классов Rectangle и Triangle и использовать их как объекты типа Shape:

Shape shape1 = new Rectangle(5, 10);
Shape shape2 = new Triangle(4, 8);

System.out.println("Area of shape1 is " + shape1.calculateArea());
System.out.println("Area of shape2 is " + shape2.calculateArea());

Здесь мы создали объекты классов Rectangle и Triangle и присвоили их переменным типа Shape. Эти объекты реализуют интерфейс Shape, поэтому мы можем использовать их как объекты типа Shape. Благодаря полиморфизму интерфейсов, мы можем писать более абстрактный код, который может работать с объектами разных классов, реализующих один и тот же интерфейс.

Кроме того, полиморфизм интерфейсов позволяет создавать более гибкие системы. Например, мы можем создать класс ShapeCalculator, который может работать с объектами любого класса, реализующего интерфейс Shape:

public class ShapeCalculator {
public double calculateTotalArea(Shape[] shapes) {
double totalArea = 0;

for (Shape shape : shapes) {
totalArea += shape.calculateArea();
}

return totalArea;
}
}

Здесь метод calculateTotalArea() принимает массив объектов типа Shape и вычисляет суммарную площадь всех фигур. Этот метод может работать с объектами разных классов, реализующих интерфейс Shape, благодаря полиморфизму.

Аналог желудочного сока Бальзам Болотова для улучшения ЖКТ и жизненной силы.