2016-02-25 4 views
-6

Я столкнулся с этим вопросом в одном интервью.Перегрузка метода

Какой из следующих методов вызывается, если у нас есть тот же класс?

public void me(StringBuilder str) 

или

public void me(String str) 

Почему?

+0

как вы называете это? –

+0

только для справки, public void me (String str) запускается, но я хочу, почему и почему? – Ashish

+7

Зависит от параметра, кстати, это не о наследовании, а о перегрузке. – fabian

ответ

0

Какая перегрузка вызывает вызов, зависит от типа времени компиляции. Этот пример добавляет третью перегрузку, которая принимает объект 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 
2

я собираюсь передать аргумент me("ashish")

В этом случае public void me(String str) будет называться.

Почему? Потому что это единственная перегрузка, которая имеет формальный тип аргумента, который соответствует фактическому (статическому) типу аргумента, который вы поставляете.

Смежные вопросы