Главная » Java » Перегрузка методов

0

Класс  может  содержать  несколько  методов  с  одинаковым  именем,  но имеющих различные списки аргументов. Такую возможность называют перегрузкой методов  (method overloading). Например, метод println() класса System может быть вызван с аргументами различного типа: String, int, char и другими.System.out.println("Привет!"); System.out.println(250); System.out.println(‘A’);

Несмотря  на  то,  что  это  выглядит  как  три  вызова  одного и того  же метода println(),  фактически же вызываются три различных метода. Вы можете спросить, почему бы не создать методы с разными именами,например,  printString()printInt()printChar()?   Одна из причин  в том, что намного проще запомнить одно имя метода для печати,  чем  запоминать  несколько  имен.  Есть  и  другие  причины  для использования  перегрузки методов, но они немного более сложные, чтобы объяснять   их   тут.   Эти   причины  (polymorfism)   нужно рассматривать в более сложных учебниках.Как  вы  помните,  наш класс Fish из  главы 4,  содержал  метод dive(),который  принимал один аргумент:public int dive(int howDeep) Давайте создадим еще одну версию этого метода,  которая не будет требовать аргументов. Этот метод заставит рыбку нырять на 5 метров, пока  глубина  погружения  не  превысит  100  метров.  Новая версия класса Fish  содержит  final  переменную  DEFAULT_DIVING (глубина  ныряния  по  умолчанию),  значение  которой  будет  равным пяти метрам. Теперь  класс Fish содержит два перегруженных метода dive().

public class Fish extends Pet {

int currentDepth=0;

final int DEFAULT_DIVING = 5;

public int dive(){

currentDepth=currentDepth + DEFAULT_DIVING;

if (currentDepth > 100){

System.out.println("Я маленькая рыбка и " +

" не могу нырять глубже 100 метров");

currentDepth=currentDepth – DEFAULT_DIVING;

}else{

System.out.println("Погружаюсь на " + DEFAULT_DIVING + " м");

System.out.println("Я на " + currentDepth +

" метров ниже уровня моря");

}

return currentDepth;

}

public int dive(int howDeep){ currentDepth=currentDepth + howDeep; if (currentDepth > 100){

System.out.println("Я маленькая рыбка и " +

" не могу нырять глубже 100 метров");

currentDepth=currentDepth – howDeep;

}else{

System.out.println("Погружаюсь на "+howDeep+" м."); System.out.println("Я на " + currentDepth +

" м. ниже уровня моря");

}

return currentDepth;

}

public String say(String something){

return "Ты не знаешь, что рыбы не умеют говорить?";

}

// constructor

Fish(int startingPosition){

currentDepth=startingPosition;

}

}

Теперь класс FishMaster может вызывать любой из  перегруженных методов  dive():public class FishMaster {

public static void main(String[] args) { Fish myFish = new Fish(20); myFish.dive(2);

myFish.dive();  // новый перегруженный метод

myFish.dive(97); myFish.dive(3); myFish.sleep();

}

}

Конструкторы  также  могут  быть  перегружены, но  при  создании  объекта будет использоваться  только  один  из них.  JVM  будет  выполнять  вызов конструктора  с соответствующим  списком  аргументов. Например, если  в класс  Fish добавить  конструктор  по  умолчанию  (без  аргументов),  класс FishMaster  сможет создать его экземпляр с помощью одного из следующих способов:Fish myFish = new Fish(20);

или

Fish myFish = new Fish();

Источник: Java  Programming for Kids, Parents and Grandparents by Yakov Fain

По теме:

  • Комментарии