Перегрузка методов классов Java

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

Статические методы могут перегружаться нестатическими и наоборот – без ограничений.

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

/* пример # 8 : вызов перегруженных методов: NumberInfo.java */

package chapt04;

public class NumberInfo {

public static void viewNum(Integer i) {//1

System.out.printf("Integer=%d%n", i);

}

public static void viewNum(int i) {//2

System.out.printf("int=%d%n", i);

}

public static void viewNum(Float f) {//3

System.out.printf("Float=%.4f%n", f);

}

public static void viewNum(Number n) {//4

System.out.println("Number=" + n);

}

public static void main(String[] args) {

Number[] num =

{new Integer(7), 71, 3.14f, 7.2 };

for (Number n : num)

viewNum(n);

viewNum(new Integer(8));

viewNum(81);

viewNum(4.14f);

viewNum(8.2);

}

}

Может показаться, что в результате компиляции и выполнения данного кода будут последовательно вызваны все четыре метода, однако в консоль будет выведено:

Number=7

Number=71

Number=3.14

Number=7.2

Integer=8

int=81

Float=4,1400

Number=8.2

То есть во всех случаях при передаче в метод элементов массива был вызван четвертый метод. Это произошло вследствие того, что выбор варианта перегруженного метода происходит на этапе компиляции и зависит от типа массива num. То, что на этапе выполнения в метод передается другой тип (для первых трех элементов массива), не имеет никакого значения, так как выбор уже был осуществлен заранее.

При непосредственной передаче объекта в метод выбор производится в зависимости от типа ссылки на этапе компиляции.

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

При перегрузке всегда следует придерживаться следующих правил:

· не использовать сложных вариантов перегрузки;

· не использовать перегрузку с одинаковым числом параметров;

· заменять при возможности перегруженные методы на несколько разных методов.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100