Перегрузка

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

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

public class Overloading1 {
    void test(int a) {
        System.out.println("a: " + a);
    }

    void test(int a, int b) {
        System.out.println("a и b: " + a + " " + b);
    }

    public static void main(String[] args) {
        Overloading1 ob = new Overloading1();

        ob.test(10);
        ob.test(10, 20);
    }
}

Как же JVM различает какой метод необходимо вызвать? Для этого в Java используется тип и/или количество аргументов метода.

Перегрузка методов является одним из способов поддержки полиморфизма в Java. 

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

В следующем примере методы void test() и double test(double a) возвращают значения разного типа. Это допустимо, но при условии, что параметры методов будут отличаться. Закомментированный метод int test() отличается от void test() только типом - это недопустимо для перегруженного метода. Если его раскомментировать, будет ошибка компиляции:

public class Overloading2 {
    void test() {
        System.out.println("Без параметров");
    }
    //неправильная перегрузка методов
   /* int test() {
        System.out.println("Без параметров");
        return 1;
    }*/

    double test(double a) {
        System.out.println("double a: " + a);
        return a * a;
    }

    public static void main(String[] args) {
        Overloading2 ob = new Overloading2();

        ob.test();
        double result = ob.test(123.25);
        System.out.println("Результат вызова метода ob.test(123.25): " + result);
    }
}

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

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

public class Box6 {
    double width;
    double height;
    double depth;

    Box6(double w, double h, double d) {
        width = w;
        height = h;
        depth = d;
    }

    Box6() {
        width = -1;  // используем -1 для
        height = -1; // обозначения непроинициализированной
        depth = -1;  // коробки
    }

    Box6(double len) {
        width = len;
        height = len;
        depth = len;
    }

    double getVolume() {
        return width * height * depth;
    }
}
public class OverloadCons {
    public static void main(String[] args) {
        Box6 myBox1 = new Box6(10, 20, 15);
        Box6 myBox2 = new Box6();
        Box6 myBox3 = new Box6(7);

        System.out.println("Объем myBox1: " + myBox1.getVolume());
        System.out.println("Объем myBox2: " + myBox2.getVolume());
        System.out.println("Объем myBox3: " + myBox3.getVolume());
    }
}
Read also:
Comments