2016-10-01 10 views
0

私はJavaを初めて使用しています。数週間前に開始され、Oracleのドキュメントとこのサイトに依存しています。徐々に私はOOPの主な概念をよく理解しています。インタフェースのインスタンスメソッドを直接呼び出す

インターフェイスのインスタンスメソッドは、実装クラスのインスタンスメソッドになり、インスタンス化された後、実装クラスのオブジェクトを通じて呼び出すことができます。

インターフェイスセットには、iterator()メソッドがあります。私が理解するには、最初にSetインタフェースを実装したクラスを持っていなければなりません。オブジェクトを介してそのメソッドを呼び出すには、そのクラスのオブジェクトをインスタンス化する必要があります。

私はオンラインで読んでいましたが、iterator()メソッドがset(setインターフェイス)のみで呼び出されていることに気付きました(つまり、setはインスタンスのインスタンスではありません)。 Setインタフェースを実装するすべてのクラス)。

私の質問です:これは可能ですか?

一方、オラクルのドキュメントによると、上記の可能性にかかわらず、iterator()メソッドはSetインタフェースの "インスタンス"と "抽象"メソッドに分類されます。では、デフォルトと静的なインタフェースメソッドだけが実装されているので、 "set"変数がどのように呼び出されますか?ここで

public static void main(String args[]) { 

    HashMap<Integer, String> hmap = new HashMap<Integer, String>(); 

    hmap.put(12, "Chaitanya"); 
    hmap.put(2, "Rahul"); 

    /* Display content using Iterator*/ 
    Set set = hmap.entrySet(); 
    Iterator iterator = set.iterator(); 
    while(iterator.hasNext()) { 
    Map.Entry mentry = (Map.Entry)iterator.next(); 
    System.out.print("key is: "+ mentry.getKey() + " & Value is: "); 
    System.out.println(mentry.getValue()); 

答えて

-1

はこれを読み込む方法です:

Set set = hmap.entrySet(); 
Iterator iterator = set.iterator(); 

実装 Setインタフェースそのset変数にオブジェクトを返しhmap.entrySet。つまり、setは、Setインタフェースで宣言されたすべてのメソッドを実装します。したがって、メソッドをsetオブジェクトに対して呼び出すことは、Setインターフェイスのメソッドの1つであるため、完全に問題ありません。

setオブジェクトその実装Setインタフェースです。それはインターフェイスではありません。唯一のインターフェイスはSetです。

+0

"set"は_object_です_implements_ [...] "特に初心者向けの誤った文です。変数_はオブジェクトではありません。それは単に_を1つだけ参照しています。変数の型には2つの意味があります。1)参照されているオブジェクトの実行時の型を制約します。 2)それはあなたがそれで呼び出すことができるメソッドを制限します。 – Seelenvirtuose

+0

別の奇妙な言葉: "' 'hmap.entrySet'は_object_を' set'変数[...]に返します。変数に_into_を戻しません。 'hmap.entrySet()'の呼び出しはオブジェクト( 'Set')への参照を返し、この参照は_assigned_で変数に代入されます。 – Seelenvirtuose

+0

参照はクラスとインタフェースの違いを識別しようとすると少し早すぎます。あなたは可変型の記述では正しいですが、制約の観点からタイプを記述することは、この時点では少し複雑です。そう思わないのですか? –

0

はい、可能です。

セットセット; ここで、setは参照変数のみです。

我々は「インターフェース1」と言うのインタフェースを持っている場合は、次のように許可されません。

インターフェース1オブジェクト=新しいインターフェース1();

しかし、クラス1は、インターフェース1実装している場合、次いで

インターフェース1 REF =新しいクラス1()及び

クラス1のREF =新しいクラス1()、

両方上 'REF' は、使用することができます。

また、あなたは、インターフェイスのすべて方法はデフォルトで公共および抽象的であり、すべての抽象メソッド実装されなければならない、ということを知っている必要があります。

これはあなたの質問にお答えします。

+0

あなたの最後の段落について少し詳しく説明できますか?私が知っているのは、SE8から始まり、インターフェイスのデフォルトと静的メソッドに実装(抽象的ではない)があるということです。上記のコードに戻って、iterator()メソッドは上書きされずに正常に動作します。 –

関連する問題