# Перегрузка (overloading) и переопределение (overriding)

1.  **Перегрузка (overloading)**:

    Перегрузка методов позволяет определить несколько методов с одним и тем же именем в одном классе, но с разными сигнатурами (типами и/или количеством параметров). При вызове перегруженного метода JVM определяет, какой метод следует вызывать, основываясь на переданных аргументах.



    ```java
    public class MyClass {
        public void print(int x) {
            System.out.println("Метод print с одним параметром: " + x);
        }

        public void print(int x, int y) {
            System.out.println("Метод print с двумя параметрами: " + x + " и " + y);
        }
    }
    ```
2.  **Переопределение (overriding)**:

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



    ```java
    // Родительский класс
    class Animal {
        void sound() {
            System.out.println("Животное издает звук");
        }
    }

    // Подкласс, переопределяющий метод родительского класса
    class Dog extends Animal {
        void sound() {
            System.out.println("Собака лает");
        }
    }
    ```



Отличие между перегрузкой и переопределением заключается в том, что перегрузка происходит в одном классе, а переопределение - в иерархии классов (суперклассе и подклассе). При перегрузке методы могут иметь разные наборы параметров, а при переопределении сигнатура метода в подклассе должна быть такой же, как и в суперклассе.
