2012-04-16 11 views
0

javaでは、インターフェイスにはメソッドの型、名前、およびパラメータのみが含まれています。実際の実装はそれを実装するクラスで行われます。このことから、インタフェースのインスタンスを作成し、クラスオブジェクトであるかのように使用することは可能ですか? org.w3c.dom.Nodeのような多くのそのようなインターフェイスがあります。Javaのインタフェースのオブジェクトを作成することはできますか?

これは私が使用していますコードです:

DocumentBuilderFactory fty = DocumentBuilderFactory.newInstance(); 
fty.setNamespaceAware(true); 
DocumentBuilder builder = fty.newDocumentBuilder(); 
ByteArrayInputStream bais = new ByteArrayInputStream(result.getBytes()); 
Document xmldoc = builder.parse(bais); 
NodeList rm1 = xmldoc.getElementsByTagName("Subject"); 
Node rm3 = rm1.item(0); 

答えて

5

をあなたはだけインターフェースのインスタンスを作成することはありません。そのインタフェースタイプのフィールド/パラメータ/ローカル変数を持つことはできますが、それは問題ありません。そのような変数に割り当てられる値は、常にnullまたはインタフェースの具体的な実装のインスタンスへの参照になります。要点は、インタフェースだけを扱うコードは、実装が何であるかを気にする必要はないはずです。

良い例はCollections.shuffle(List)です。私はそのリストの実装をすべて提供でき、インターフェイスで宣言されたメソッドのみを使用します。 実際のオブジェクトは、常に具体的な実装のインスタンスになりますが、shuffleメソッドは、知っているか気にする必要はありません。

+0

は、私が使用している(ノード内の)ノードは実際にはあるクラスのどこかで実装されていると言っています。そして私はそのクラスの議論を使用していますか? – Ashwin

+0

@Ashwin:そうです。 –

+0

しかし、実装はどこで提供されていますか? – Ashwin

2

使用可能なインターフェイスクラスを取得するには2通りの方法があります。 我々はインタフェースを持っている場合は、次のインターフェイスを実装するクラスを持っていると言うよう

public interface Vehicle{ 
    public void drive(); 
} 

最初は、次のとおりです。

public class Car implements Vehicle{ 
    public void drive(){ 
     System.out.println("Here in my car I feel safest of all); 
    } 
} 
Vehicle car = new Car(); 
v.drive(); 

それとも、匿名クラスを作成することができます

Vehicle v = new Vehicle(){ 
    public void drive(){ 
     System.out.println("Hello world"); 
    } 
}; 
v.drive(); 
+0

大丈夫です。しかし、ここで何が起こっています。 NodeList nodelist1 = xmldoc.getElementsByTagName( "Subject");ノードnode1 = rm1.item(0); node1.getFirstChild()。setNodeValue(suserid); 。 node1の実装はどこですか? – Ashwin

+0

@Ashwin呼び出すコードは、特定の実装を使用します。これは、ある時点(ドキュメントの作成中か、getElementsByTagNameの呼び出し中)で作成されます。 – Jim

+0

@Ashwin本質的に、それは重要ではありません。すべてのコードは、それが 'Node'であることを気にする必要があります。しかし、あなたが好奇心をもっているのであれば、 'node1.getClass()。getName()'を使って実装クラスのクラス名を調べることができます。 – Jim

0

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

Listは、実装クラスのArrayListというインターフェイスです。 これは実装(クラス)を隠し、要件/契約(インタフェース)のみを提供します。それは、あなたがLinkedListでArrayListを交換できるように、プログラミングの健全な方法です(リストに文字列が多くない場合)

2

あなたはインターフェイスのインスタンスを作成しません。インターフェース。あなたが好きなように多くの異なる実装を作成して、最高のフィットいずれかを選択できます。

あなたのコードでは、インターフェイスに準拠したオブジェクトが必要な実装を使用することができます。

+1

スナップ最初の行);) –

0

あなたがドン」インターフェイスのインスタンスを作成すると、インターフェイスを実装するクラスのインスタンスが作成されます。

例えば、

Map<String, String> map = new LinkedHashMap<String, String>(); 

Mapはインターフェースであり、LinkedHashMapインタフェースを実装するクラスです。それは彼女自身のインスタンスを作成することはできませんので、それがtype.Itを実装し、いくつかの方法があり、クラスのタイプを保持していないので、

0

インターフェースは抽象型を持つ特別なクラスであります彼女。したがって、参照変数のみを作成することができ、オブジェクトを参照し、オブジェクトのクラスがインターフェイスを実装する必要があることを確認します。

関連する問題