> For the complete documentation index, see [llms.txt](https://opu.gitbook.io/oop/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://opu.gitbook.io/oop/2019-2020-archive/arkhiv-1/labs/lab_3/2.-peregruzka-metodov.md).

# 2. Перегрузка методов

## 1. Что такое перегрузка методов

В Java разрешается в одном и том же классе определять два или более метода с одинаковым именем, если только объявления их параметров отличаются. В этом случае методы называются **перегружаемыми**, а сам процесс – **перегрузкой метода** (**method overloading**).

```java
class MyClass {
    
    public void foo() {
        // ... код
    }
    
    public void foo(String s) {
        // ... код
    }
}
```

Если у методов одинаковые имена, как Java узнает, какой именно из них вызывается? Ответ прост: **перегружаемые методы должны отличаться по типу и/или количеству входных параметров**. Даже разного порядка аргументов достаточно для того, чтобы методы считались разными (хотя это не рекомендуется).

**Перегрузка по возвращаемым значениям**

Логично спросить, почему при перегрузке используются только имена классов и списки аргументов? Почему не идентифицировать методы по их возвращаемым значениям?

```java
// ДАННЫЙ КОД ВЫЗОВЕТ ОШИБКУ КОМПИЛЯЦИИ!

class MyClass {

    public int foo() {
        return 0;
    }

    public double foo() {
        return 0;
    }
}
```

Идентифицировать их нельзя, потому что Java в этом случае не может определить, какая версия метода должна выполняться.

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

**Перегрузка методов позволяет поддерживать принцип «один интерфейс, несколько методов».**

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

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

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

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

**Перегрузка конструкторов**

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

Соответствующий перегружаемый конструктор вызывается в зависимости от параметров, указываемых при выполнении оператора **new**.

```java
class MyClass {
    
    public MyClass() {
        // какой-то код
    }
    
    public MyClass(int arg0) {
        // какой-то код
    }
    
    public MyClass (int arg0, String arg1) {
        // какой-то код
    }
}
```

Если вы пишете для класса несколько конструкторов, иногда бывает удобно вызвать один конструктор из другого, чтобы избежать дублирования кода. Такая операция проводится с использованием ключевого слова **this**.

```java
class MyClass {

    public MyClass() {
        // Вызываем конструктор MyClass(int arg0)
        this(0);
    }

    public MyClass(int arg0) {
        // Вызываем конструктор MyClass (int arg0, String arg1)
        this(arg0, " ");
    }

    public MyClass(int arg0, String arg1) {
        // какой-то код
    }
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://opu.gitbook.io/oop/2019-2020-archive/arkhiv-1/labs/lab_3/2.-peregruzka-metodov.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
