Перегрузка и переопределение

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ProgrammingTechniquesGroup(["Programming Techniques"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/ProgrammingTechniquesGroup -.-> java/method_overloading("Method Overloading") java/ProgrammingTechniquesGroup -.-> java/method_overriding("Method Overriding") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/constructors("Constructors") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/oop("OOP") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/inheritance("Inheritance") subgraph Lab Skills java/method_overloading -.-> lab-178549{{"Перегрузка и переопределение"}} java/method_overriding -.-> lab-178549{{"Перегрузка и переопределение"}} java/classes_objects -.-> lab-178549{{"Перегрузка и переопределение"}} java/constructors -.-> lab-178549{{"Перегрузка и переопределение"}} java/oop -.-> lab-178549{{"Перегрузка и переопределение"}} java/inheritance -.-> lab-178549{{"Перегрузка и переопределение"}} end

Перегрузка

В предыдущей части мы уже использовали перегрузку в классе Person, так как у него были три конструктора. Это простой пример. Перегрузка - это возможность, которая позволяет классу иметь несколько методов с одинаковым именем. Таким образом, мы можем обрабатывать разные ситуации и не будем путаться. Как правило, существуют три способа достичь перегрузки:

  • Разное количество параметров
  • Разные типы параметров
  • Разный порядок разных типов параметров

Пример:

Напишите следующий код в файле /home/labex/project/overloadingTest.java:

public class overloadingTest{
    public static void main(String[] args){
        overloadingTest test = new overloadingTest();
        System.out.println("add(10,20)= " + test.add(10,20));
        System.out.println("add(10,20,30)= " + test.add(10,20,30));
        System.out.println("add(5.5, 10.5)= " + test.add(5.5f, 10.5f));

        test.printInfo(1, "an error!");
        test.printInfo("another error!", 2);
    }
    // этот метод имеет два параметра int, возвращает целое число
    int add(int a, int b){
        return a+b;
    }
    // этот метод имеет три параметра int, возвращает целое число
    int add(int a, int b, int c){
        return a+b+c;
    }
    // этот метод имеет два параметра float, возвращает число с плавающей точкой
    float add(float a, float b){
        return a+b;
    }
    // этот метод имеет один параметр string и один параметр int, ничего не возвращает
    void printInfo(String str, int code){
        System.out.println("Code: " + code + "\nMessage: " + str);
    }
    // этот метод имеет один параметр int и один параметр string, ничего не возвращает
    void printInfo(int code, String str){
        System.out.println("Code: " + code + "\nMessage: " + str);
    }
}

Вывод:

Запустите файл overloadingTest.java с использованием следующих команд:

javac /home/labex/project/overloadingTest.java
java overloadingTest

Посмотрите на вывод:

add(10,20)= 30
add(10,20,30)= 60
add(5.5, 10.5)= 16.0
Code: 1
Message: an error!
Code: 2
Message: another error!

Переопределение

Если класс наследует метод от своего суперкласса, то есть возможность переопределить метод, если он не помечен как final или private. Переопределением мы можем определить поведение, специфичное для подкласса, что означает, что подкласс может реализовать метод родительского класса в соответствии с своими требованиями. В объектно-ориентированном программировании переопределение означает переопределение функциональности существующего метода. Тип возвращаемого значения должен быть тем же или подтипом типа возвращаемого значения, объявленного в исходном (переопределенном) методе в суперклассе. Уровень доступа не может быть более ограничивающим, чем уровень доступа переопределяемого метода. Например: если метод суперкласса объявлен как public, то переопределяющий метод в подклассе не может быть ни private, ни protected. Также рассмотрим пример с классом Animal (простая версия).

Пример:

Напишите следующий код в файле /home/labex/project/overridingTest.java:

class Animal{
    public void grow(){
        System.out.println("I'm animal, I grow up.");
    }
    public void sleep(){
        System.out.println("I'm animal, I am sleeping.");
    }
}
class Dog extends Animal{
    // переопределенный метод
    public void grow(){
        System.out.println("I'm dog, I grow up.");
    }
}
class Bird extends Animal{
    // сохраняем grow() суперкласса, добавляем собственные инструкции
    // переопределенный метод
    public void grow(){
        super.grow();
        System.out.println("I'm bird, I grow up.");
    }
    // переопределенный метод
    public void sleep(){
        System.out.println("I'm bird, I am sleeping...");
    }
    // собственный метод Bird
    public void sing(){
        System.out.println("I'm bird, I am singing a song...");
    }
}
public class overridingTest{
    public static void main(String[] args){
        Dog dog = new Dog();
        dog.grow();
        Bird bird = new Bird();
        bird.grow();
    }
}

Вывод:

Запустите файл overridingTest.java с использованием следующих команд:

javac /home/labex/project/overridingTest.java
java overridingTest

Посмотрите на вывод:

I'm dog, I grow up.
I'm animal, I grow up.
I'm bird, I grow up.

Обзор

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