2011-09-01 20 views
32

Da The Java Tutorials:Interfaccia come tipo in Java?

In Java, una classe può ereditare da una sola classe, ma può implementare più di un'interfaccia. Pertanto, gli oggetti possono avere più tipi: il tipo della loro classe e i tipi di tutte le interfacce implementate da . Ciò significa che se una variabile viene dichiarata come il tipo di un'interfaccia, il suo valore può fare riferimento a qualsiasi oggetto che sia istanziato da qualsiasi classe che implementa l'interfaccia.

Qualcuno può fornirmi uno pseudo tipo di base per questo. Non ho capito le linee in grassetto.

risposta

51

Diamo dichiarare due interfacce e una classe che li implementa sia:

interface I1 { } 

interface I2 { } 

class C implements I1, I2 { } 

oggetti possono avere più tipi

Nel codice seguente, si può osservare che una C istanza ha il tipo di C e I1 e I2:

C c = new C(); 

boolean isC = (c instanceof C); //true 
boolean isI1 = (c instanceof I1); //true 
boolean isI2 = (c instanceof I2); //true 

Ora si dichiara una classe B che implementa I1 così:

class B implements I1 { } 

se una variabile è dichiarata essere il tipo di interfaccia, il suo valore può fare riferimento a qualsiasi oggetto che viene creata un'istanza da qualsiasi classe che implementa l'interfaccia.

Se si dichiara una variabile di tipo I1, siamo in grado di impostare a un'istanza di C, e quindi riassegnarlo a un'istanza di B:

I1 i1 = new C(); 
i1 = new B(); 

Possiamo anche riassegnare a un esempio di D, dove D estende C:

i1 = new D(); 

... 

class D extends C { } 
+0

molto ben spiegato – Thor

2

Le affermazioni citate (da dove?) Sono vere ma fuorvianti - gli oggetti hanno già più tipi senza interfacce.

Ad esempio, "bimmelim" ha il tipo String, ma ha anche il tipo Object. Le interfacce non cambiano, tranne che "bimmelim"anche ha il tipo Serializable, CharSequence e altri.

In realtà, è forse discutibile se dobbiamo dire che "bimmelim""ha" il tipo Object, ma certamente un riferimento ad esso si inserisce nel un Object variabili.

Se una variabile viene dichiarata tipo di un'interfaccia ... per esempio

CharSequence x ; 

... quindi il suo valore può fare riferimento ad un oggetto String come "bimmelim", o potrebbe possibilmente essere un StringBuffer, che è un altro tipo che implementa CharSequence.

+0

+1 Sono d'accordo sul fatto che la citazione sia fuorviante. –

1

Quello che segue è un incarico corretta:

class AClass implements AInterface { 
} 


AInterface var = new AClass(); 
10

consideri il seguente esempio:

Serializable s = new ArrayList(); 

In Java, questo è un codice valido, anche se Serializable è un'interfaccia, perché ArrayList implementa Serializable . Quindi, in questo caso, stiamo trattando s come variabile di tipo Serializable.

Ora supponiamo seguiamo il codice precedente con il seguente:

s = "String object"; 

questo è valido anche perché String implementa anche Serializable. Poiché abbiamo dichiarato s come tipo Serializable, è possibile fare riferimento a qualsiasi oggetto che implementa tale interfaccia.

3
class Ball extends Rubber implements Jumping, Rolling, Squeezing { 
    public void jump(){} 
    public void roll(){} 
    public void squeeze(){} 
} 

Ball b = new Ball(); 
Jumping j = new Ball(); 
j.jump(); 
1

Si consideri il seguente classe e di interfaccia definizioni:

public class A { } 

public class B extends A implements I { } 

public interface I { } 

Le seguenti dichiarazioni sono tutto legale:

A first = new A(); 
B second = new B(); 
A third = new B(); 
I fourth = new B(); 

A causa B implementa I e si estende A, può essere utilizzato come un valore ovunque sia previsto un "I" o una "A".

5

oggetti possono avere più tipi

Si consideri il seguente frammento:

public class MyClass extends ParentClass implements Interface1, Interface2 {  
    //some code  
} 

Questa classe può essere utilizzato in luoghi diversi come segue:

MyClass m1 = new MyClass(); 
ParentClass p = new MyClass(); 
Interface1 i1 = new MyClass(); 
Interface2 i2 = new MyClass(); 

variabile è dichiarata essere il tipo di un'interfaccia, il suo valore può fare riferimento a qualsiasi oggetto istanziato da qualsiasi classe che implementa l'interfaccia.

Considerate le ultime due righe nel codice precedente, una variabile di tipo Interface1 può fare riferimento a qualsiasi oggetto che implementa questa interfaccia, quindi se abbiamo un'altra classe implementa Interface1, dire MyClass2, quindi

Interface1 i1 = new MyClass(); 
Interface1 i2 = new MyClasss2(); 
i1 = i2; 
i1 = new MyClass2(); 

Tutto le assegnazioni precedenti sono validi perché MyClass e MyClass2 implementa Interface1

2

String implementa più interfacce, quindi ha diversi tipi:

String s = "A String"; 
Comparable<String> comp = s; 
CharSequece cs = s; 
Serializable ser = s; 

L'interfaccia CharSequence viene implementata da più classi, quindi un riferimento CharSequence può contenere tutti i tipi di oggetti:

CharSequence cs = "A String"; 
cs = new StringBuilder(); 
cs = new Segment(); 
1

Prendere l'interfaccia Collection dalle librerie standard di Java come un esempio. Qualsiasi variabile dichiarata come di tipo Collection può quindi essere assegnata a un oggetto di una classe che implementa l'interfaccia Collection, ad es. ArrayList, Stack, ... vedere il documento collegato per altri esempi.

2

oggetti possono avere più tipi

Esempio:

public class Foo implements Runnable, Callable<Integer> { 
    public void run() {} 
    public Integer call() {return 1;} 
} 

Foo foo = new Foo(); 
Runnable r = foo; 
Callable<Integer> c = foo; 

Esempio:

se una variabile è dichiarata essere il tipo di interfaccia, il suo valore può fare riferimento a qualsiasi oggetto istanziato da qualsiasi classe che implementa l'interfaccia

Runnable r = new Foo(); 
r = Thread.currentThread(); //Thread implements Runnable 
2

esempio-Molto semplice

List<String> list1=new ArrayList<String>();

Poiché, ArrayList implementa Elenco pertanto si può utilizzare interfaccia List variabile cioè list1 per fare riferimento all'oggetto creato da Arraylist.

Problemi correlati