2013-12-22 2 views
0

Почему перегрузка здесь не происходит, хотя передается целочисленный аргумент методу «p». ?Перегрузка с помощью переопределения

public class Test { 
    public static void main(String[] args) { 
     B a = new A(); 
     a.p(10); 
     a.p(10.0); 
    } 
} 

class B { 
    public void p(double i) { 
     System.out.println(i * 2); 
    } 
} 

class A extends B { 
    // This method the method in B 
    public void p(int i) { 
     System.out.println(i); 
    } 
    //added below code 
    public void p(double i) { 
     System.out.println(i*5); 
    } 
} 



Output:50.0 
     50.0 
+2

Невероятно запутать 'A' extend' B'. Почти каждый пример переопределения в мире делает 'A' родительским классом. –

ответ

2

Поскольку переменная a объявлена ​​как B, только p метод, объявленный в B видна и таким образом выбраны. В этом нет никаких оснований.

Если у вас есть сомнения, укажите свой метод с помощью @Override в вашей любимой среде IDE. IDE не позволит скомпилировать его, если он фактически не отменяет ничего.


После правки, теперь у вас переопределен метод в виде A#p(double). При вызове

a.p(10); 
a.p(10.0); 

Метод p видимую на B класса будет вызван. Через полиморфизм и потому, что переменная a имеет тип времени выполнения A, будет вызван метод переопределения, объявленный в A.


Обратите внимание, что int аргумент в

a.p(10); 

становится double через widening primitive conversion.

0

Потому что вы вызываете вещи через ссылку-на-B. У этого есть только один метод.

+0

Тогда что такое использование объекта A здесь? когда выполняется конкретный метод объекта (здесь «A»)? – user3126466

+0

@ user3126466: В этом случае нет никакой пользы. В вашем примере нет переопределенных методов. –

+0

теперь я отредактировал и добавил метод overriden в классе A. Так что здесь перегрузка не существует .. – user3126466

0

Это всегда вызов метода в B, потому что:

  • переменная имеет тип B, поэтому компилятор знает только о методе double
  • метод в A не переопределяет метод B «s потому что тип параметра int отличается от Bdouble - он невидим к вызывающему коду
Смежные вопросы