2016-09-08 4 views
-1

Ich lerne Serialisierung und stieß auf diese Funktion (in Externalisierung).Erläuterung zu Java Serialisierung

public void writeExternal(ObjectOutput oi) throws IOException, ClassNotFoundException 

Ich verstehe, dass die Methode ein Objekt oi des Typs ObjectOutput zum Schreiben von Instanzvariablen auf das Objekt erstellt. Als ich mehr über die Klasse ObjectOutput erfahren wollte, war ich überrascht, dass ObjectOutput eine Schnittstelle ist! Ich dachte, Java erlaubt keine Objekte vom Typ Interface zu erstellen. Bitte lassen Sie mich wissen, warum das der Fall ist oder korrigieren Sie mich, wenn ich etwas falsch verstanden habe.

+0

ObjectOutput wird hier nicht erstellt. Es ist das Argument für die Methode und wird vom Aufrufer bereitgestellt. Und das Objekt kann vom Typ ObjectOutput sein, solange das bereitgestellte Objekt die Schnittstelle implementiert. – trappski

Antwort

0

Zunächst einmal, wie trappski in den Kommentaren hingewiesen, writeExternal erstellt nichts. ObjectOutput ist ein Parameter, der von jedem Code übergeben wird, der writeExternal aufruft.

Der Trick mit Schnittstellen ist, dass sie ein "Vertrag" sind. Sie können keine Objekte über Schnittstellen erstellen, aber Sie können Klassen erstellen, die die Schnittstelle implementieren, und dann Objekte aus diesen Klassen erstellen. Sie können dann Objekte der Klassen verwenden, die die Schnittstelle an einer beliebigen Stelle implementieren, an der die Schnittstelle erwartet wird.

In diesem Fall, wenn Sie eine Klasse haben BigObjectOutput die ObjectOutput wie so implementiert:

class BigObjectOutput implements ObjectOutput { 
    // code... 
} 

dann können Sie ein Objekt des Typs erstellen BigObjectOutput wie folgt aus:

BigObjectOutput bigObject = new BigObjectOutput; 

und geben es in Ihre Methode, weil BigObjectOutput implementiert ObjectOutput:

Warum möchten Sie das tun?

class LittleObjectOutput implements ObjectOutput { 
    // code... 
} 

LittleObjectOutput littleObject = new LittleObjectOutput(); 

writeOutput(littleObject); 

So ist Ihr writeOutput nützlicher, wenn es ein beliebiges Objekt übernimmt, deren Typ implementiert die OutputObject Schnittstelle, als wenn es dauerte nur BigObjectOutput s: Damit Sie in jedem Objekt, dessen Typ implementiert ObjectOutput passieren kann.

+0

Danke für deine Erklärung @Emma Burrows, aber in deinem Beispiel versuchst du 'code' zu ​​sagen – Srinivas

0

Danke für Ihre Erklärung @Emma. Meinten Sie Klasse LittleObjectOutput sagen erweitert BigObjectOutput implementiert ObjectOutput { // Code ... }

LittleObjectOutput littleObject = new LittleObjectOutput();

writeExternal (littleObject);

  • was bedeutet, dass die Funktion nützlich ist, wenn sie sowohl vom Elternteil als auch vom Kind verwendet werden kann?
+0

Nein, mein Beispiel war, dass sowohl' BigObjectOutput' als auch 'LittleObjectOutput' die Schnittstelle implementieren. Sie brauchen sich nicht zu verlängern. Der Schlüssel hier ist, dass sie beide die Schnittstelle implementieren und daher beide in der Methode verwendet werden können, die diese Schnittstelle erwartet. –