2013-04-23 17 views
19

Diciamo che ho un'interfaccia A, definire come di seguito:Confusione sulla chiamata di metodo di interfaccia Java

public interface A { 
    public a(); 
} 

Esso include un metodo chiamato.

Ho una classe implementa questa interfaccia, diciamo:

public class AImpl implements A{ 
     public void a() 
    { 
     println("Do something"); 
    } 

} 

questa classe implementare solo questo metodo.

Ecco la mia domanda: quindi se nella classe principale, chiamo metodo di interfaccia, chiamerà il metodo nella classe che implementa l'interfaccia? Ad esempio:

public static void main(String[] args){ 
    A aa; 
    aa.a(); 
} 

Chiamerà il metodo nella classe AImpl e restituirà "Fai qualcosa"?

+2

Il lato sinistro è sempre solo uno slot in cui un oggetto può andare. Come ha detto Johan, devi effettivamente "mettere" un oggetto lì creando uno con "nuovo". – sdasdadas

+0

Prova a postare [SSCCE] (http://sscce.org) per descrivere il tuo problema. E includi i messaggi di errore che ricevi. L'interfaccia non verrà compilata e il metodo principale genererà un 'NullPointerException'. Oltre a questo, la tua domanda è valida e dovrebbe essere risolta dalla mia risposta qui sotto. – jlordo

+0

Ora capisco –

risposta

2

È necessario richiamare la routine sull'oggetto reale AImpl

A aa = new AImpl(); 
aa.a(); 

che qui è equivalente al seguente

AImpl aa = new AImpl(); 
aa.a(); 

tuo campione solleverà un errore dal momento che si sta cercando invocare un metodo su un oggetto nonitalizzato.

+0

Non uguale nel senso di OO Design. Se hai questa interfaccia, devi usarla per dimostrare che è esistenza. – zgulser

25
A aa = new AImpl(); 
aa.a(); 

Qui la variabile di riferimento è l'interfaccia A tipo effettivo Ma Object è AImpl.

Quando si definisce una nuova interfaccia, si sta definendo un nuovo tipo di dati di riferimento . È possibile utilizzare i nomi di interfaccia ovunque sia possibile utilizzare qualsiasi altro nome di tipo di dati . Se si definisce una variabile di riferimento il cui tipo è un'interfaccia , qualsiasi oggetto assegnato ad esso deve essere un'istanza di una classe che implementa l'interfaccia.

saperne di più su Documentation

riferimento Un'interfaccia può contenere oggetti di AImpl in quanto implementa l'Un'interfaccia.

+1

+1 per la citazione :) –

+0

Grazie mille, questo è giusto –

2

Probabilmente si potrebbe scoprire eseguendo il codice da soli.

Attualmente riceverai un NullPointerException perché non hai assegnato nulla alla variabile aa. Cambiare il codice di seguito si richiamare il metodo e l'uscita del testo:

public static void main(String[] args){ 
    A aa = new AImpl(); 
    aa.a(); 
} 
1

No. Io non lo farò.

Hai dichiarato una variabile. Dovresti inizializzarlo prima con l'istanza di un oggetto in questo caso la tua classe AImpl.

public static void main(String[] args){ 
    A aa = new AImp(); 
    aa.a(); 
} 
+0

hai ragione, grazie –

17

Dipende dal tipo di runtime dell'oggetto.Vedere:

Questa è l'interfaccia:

public interface A { 
    public void a(); 
} 

E questa è la tua classe:

public class AImpl implements A { 
    public void a() { 
     println("I am AImpl"); 
    } 
} 

C'è un'altra implementazione:

public class AnotherAImpl implements A { 
    public void a() { 
     println("I am another AImpl"); 
    } 
} 

in modo da avere uno sguardo al presente metodo principale:

public static void main(String[] args){ 
    A aa; 
    aa = new AImpl(); 
    aa.a(); // prints I am AImpl 
    aa = new AnotherAImpl(); 
    aa.a(); // now it prints I am another AImpl 
} 
+0

Grazie, ora capisco –

+2

L'esempio non è un altro modo di insegnare, è l'unico modo per insegnare (Albert Einstein). Grazie. – Eftekhari

Problemi correlati