2014-06-12 12 views
7

Ho 3 classi GrandParent, Parent e Child, dove Child extends Parent e Parent extends GrandParentMetodo sovraccarico con genitore e categoria bambino come parametro

public class Main { 
    void test(GrandParent gp){System.out.println("GrandParent");} 
    void test(Parent p){System.out.println("Parent");} 

    public static void main(String args[]){ 
     GrandParent obj = new Child(); 
     Main mainObj = new Main(); 
     mainObj.test(obj); // This calls test(GrandParent gp) 

     mainObj.test(new Child()); // This calss test(Parent gp) 
    } 
} 

Nel codice sopra nei 2 chiamate al test() metodo sia con Child oggetto chiama differente metodi. In uno sta facendo compilazione-tempo e in altri vincoli di runtime. Questo suona strano per me. Come lo spiegheresti?

+2

Uh, mi sembra come se fosse a tempo di compilazione vincolante in entrambi i casi ... Look up come metodo di overload sono risolti, ci dovrebbe essere una risposta girano su SO qualche parte – awksp

+0

E 'tempo di compilazione entrambi i casi ... –

risposta

7

L'overloading del metodo è un polimorfismo in fase di compilazione.

L'override del metodo è il polimorfismo di runtime.

Nel tuo caso, stai sovraccaricando due metodi di istanza della classe Main.

Tuttavia, poiché presumo nel contesto Child estende Parent, new Child() instanceof Parent == true quindi un'istanza di Child è un argomento valido per il metodo test con argomento di tipo Parent.

Nel primo caso, si passa un tipo di riferimento nel metodo test e si trova il tipo esatto.

Nel secondo caso, si passa un tipo di riferimento Child nel metodo test. La corrispondenza più vicina è Parent, quindi viene invocato test(Parent p).

0

Overloading significa stesso parametro diverso nome. Ad esempio:

 class A { 
      public void m1(int a) { 
       System.out.println("class A"); 
      } 
      public void m1(int a,int b) { 
       System.out.prinln("2 parameter"); 
      } 
     } 

Questo metodo è chiamato sovraccarico.

+4

Questo è vero , ma questo non risponde completamente alla domanda dell'OP. – awksp

0

Penso che tu ti stia confondendo con la tua gerarchia.

Il fatto che tu dica: Child extends Parent - ciò significa che un Child "è un" Parent.

Dato che questo non ha senso nel "mondo reale" - ha comunque senso nel codice - si sta fornendo un oggetto Bambino al metodo test void (Parent p) - e sin da bambino è un genitore - questo è il motivo per cui viene invocato System.out.println ("Parent").

+1

Ma un 'Bambino' è anche un' nonno' in questa gerarchia, giusto? Quindi, perché viene invocato il metodo 'Parent' e non il metodo' Grandparent'? Hai ragione tecnicamente, ma non rispondi completamente alla domanda dell'OP. – awksp

+0

Suppongo che, data un'altra dichiarazione di corrispondenza, diciamo - void test (Object o) che fornendo un oggetto Child invocherebbe questo metodo, poiché la classe Child estende implicitamente Object. Potrei comunque sbagliarmi. –

+0

A seconda se sto pensando la stessa cosa di te, in realtà non lo farebbe, se tu facessi 'test (new Child())'. Se assegnassi 'new Child()' a un 'Object' e lo superi, penso che lo farebbe. – awksp

Problemi correlati