• ベストアンサー

Javaのパッケージについて

パッケージはクラスを複数管理するものと学習したのですが、 インタフェースも管理できるのでしょうか? Iteratorインタフェースを使ったプログラムを見ていますが、classの宣言のところでimplementsと書かずにhasNext()メソッドを使っているので、気になりました。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • auty
  • ベストアンサー率58% (284/486)
回答No.2

>>> classの宣言のところでimplementsと書かず このクラスが自分Aのメソッドとして、hasNext()を使う場合は、当然、 implements が必要となります。 しかしながら、implements しなくても、インタフェースは利用できます。 ------------------------------------------------------------ たとえば、java.util.Iterator は、publicです。 public interface Iterator したがって、importしていれば、 import java.util.*; 次のような利用は可能となります。 for (Iterator i = map.iterator(); i.hasNext();) { ------------------------------------------------------------ このhasNext()は、クラスAのメソッドではありません。 このようにIteratorには public が付いているので、Iterator は、他のパッケージからも見えることになります。 恐らくこういった状態で、 「Iteratorインタフェースを使ったプログラム」 を見ているのではないでしょうか。

ukurere84
質問者

補足

autyさん、こんばんは。ご回答ありがとうございます。 なるほど、インタフェースもパッケージ化できるのですね。 もう一つ、質問になるのですが、インタフェースはメソッドの定義のみで、処理は書かないものだと思いますが、 これだとhasNext()やnext()の処理はどこに書いてあるのでしょうか? すいません、分からないことだらけで。。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • auty
  • ベストアンサー率58% (284/486)
回答No.3

・ 例えば最もよく使われるArrayListについて追って見ましょう。 ArrayList -----> AbstractList        継承 ArrayListは、AbstractListを継承しています。 そのArrayListのソースコードは、 ------------------------------------------------------------ public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { ------------------------------------------------------------ そこで、AbstractListを見てみます。 ------------------------------------------------------------ public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { public Iterator<E> iterator() { return new Itr(); } private class Itr implements Iterator<E> { public boolean hasNext() { return cursor != size(); } public E next() { checkForComodification(); try { E next = get(cursor); lastRet = cursor++; return next; } catch (IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } } } ------------------------------------------------------------ このように、AbstractListの内部クラスとしてのクラスItr が Iteratorを実装しています。 ・ ソースコードを辿るのは、eclipse等のIDE(統合開発環境)では、[F3] キーで 簡単に出来ます。 ・ スーパークラスやインタフェースの変数に代入するやり方は、テクニックとしても重要でよく使われます。

ukurere84
質問者

お礼

こんばんは。 また詳しい解説ありがとうございます! 実際に自分でもソースコード見てみました。 内部クラスなど、複雑に感じましたが、勉強して行こうと思います。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • BleuLune
  • ベストアンサー率57% (15/26)
回答No.1

当然、インタフェースもクラスと一緒にパッケージにて管理できます。 それより >Iteratorインタフェースを使ったプログラムを見ていますが、classの宣言のところでimplementsと書かずにhasNext()メソッドを使っているので、気になりました。 上記内容の意味が全く分かりません。 文言どおりならコンパイルできるはずがないと思いますが、コンパイルエラーはでていないのでしょうか?

ukurere84
質問者

補足

>Iteratorインタフェースを使ったプログラムを見ていますが、classの宣言のところでimplementsと書かずにhasNext()メソッドを使っているので、気になりました。 autyさんの解説によると、 Iteratorを実装している内部クラスのメソッドとして使っているようです。

すると、全ての回答が全文表示されます。

関連するQ&A