2011-02-01 4 views
0
public class Ex 
{ 
    public void eat(Animal animal){System.out.println("this is animal");} 
    public void eat(Dog dog){System.out.println("this is dog");} 
    public static void main(String[] args) 
    { 
     Ex ex=new Ex(); 
     Animal animal=new Dog(); 
     ex.eat(animal); 
    } 
} 

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

+0

Принципы полиморфизма имеют 'eat()' метод класса 'Animal', который' Dog' может переопределить. Таким образом, вам не нужно писать перегруженные методы, объект - тот, кто решает, как он функционирует. – unholysampler

+0

@unholysampler, конечно, это решает его частично, но предположим, что у вас есть четыре метода: «поесть (Animal a, Spagetti s)», «есть (Animal a, Pizza p)», «eat (Dog d, Spagetti s)», и 'eat (Dog d, Pizza p)'. – aioobe

+0

@aioobe: Код вроде этого - дорога в ад. JUst do: 'Animal.eat (Food)', где Animal and Food - абстрактные классы для собак и спагетти и пиццы. – Mchl

ответ

4

Потому что решаются в время компиляции, какой метод для вызова ,

В общем случае компилятор не может решить тип среды выполнения (она неразрешима), поэтому компилятор играет в нее безопасно и делает вызов метода, который, несомненно, «работает».

Стандартное «обходное» - это использование visitor pattern. Я написал подробный пример здесь: How to avoid large if-statements and instanceof

+0

ok Я знаю, что методы перегрузки вызываются только с использованием ссылочного типа, а не фактического экземпляра, к которому он относится. Почему дизайнеры java избегают полиморфизма для перегрузки – saravanan

+0

@saravanan, я не знаю точно, но я уверен, что основная причина будет производительность. Кроме того, способ, которым он работает внутри, заключается в том, что метод идентифицируется по типам имен + аргументов. То есть ваши два метода приема пищи полностью отличаются от точки зрения JVM. (Я пытаюсь сказать, что я даже не уверен, что это будет иметь смысл с этой точки зрения.) – aioobe

+0

спасибо, человек, вот что я искал;) –

0

Потому что java не поддерживает multiple dispatch .. Но вы можете имитировать поведение двойной отправки с помощью Visitor pattern.