Я столкнулся с этим вопросом в одном интервью.Перегрузка метода
Какой из следующих методов вызывается, если у нас есть тот же класс?
public void me(StringBuilder str)
или
public void me(String str)
Почему?
Я столкнулся с этим вопросом в одном интервью.Перегрузка метода
Какой из следующих методов вызывается, если у нас есть тот же класс?
public void me(StringBuilder str)
или
public void me(String str)
Почему?
Какая перегрузка вызывает вызов, зависит от типа времени компиляции. Этот пример добавляет третью перегрузку, которая принимает объект Object, передавая String in, вызывает перегрузку, которая принимает вызываемую String, когда аргумент вводится как String, а его значение как объект вызывает перегрузку, которая принимает объект для вызова:
public class Overload {
public void me(StringBuilder b) {
System.out.println("builder " + b);
}
public void me(String b) {
System.out.println("string " + b);
}
public void me(Object o) {
System.out.println("object " + o);
}
public static void main(String... args) {
Overload o = new Overload();
o.me(new StringBuilder("foo"));
o.me("bar");
o.me((Object)"asdf");
}
}
печатает
builder foo
string bar
object asdf
я собираюсь передать аргумент
me("ashish")
В этом случае public void me(String str)
будет называться.
Почему? Потому что это единственная перегрузка, которая имеет формальный тип аргумента, который соответствует фактическому (статическому) типу аргумента, который вы поставляете.
как вы называете это? –
только для справки, public void me (String str) запускается, но я хочу, почему и почему? – Ashish
Зависит от параметра, кстати, это не о наследовании, а о перегрузке. – fabian