2016-04-19 19 views
1

私は非常に混乱しているトピックについて明確にすることを望んでいます:ArrayList/List/ObservableListの関係は、クラス間の違いおよびインターフェイス。私はそのテーマについて複数のテキストを読んだことがあります。私が読むほど、私はもっと混乱していきます。一般的なArrayList/ObservableList/Listとクラスとインターフェイスの関係

ここで私は確かに分かっていることです:ArrayListは、あなたが好きなだけ多くのArrayListオブジェクトを作成できることを意味するClassです。私はJavaFXを学んでいますが、ObservableListsを入力として使うFXオブジェクトがたくさんあります。しかし、ObservableListsはクラスではなくInterfacesなので、ObservableListオブジェクトの作成は忘れてしまいます。最初は、ArrayListがListの子クラスであり、ObservableListがリスト& Listの子クラスをリストするインターフェイスであると仮定しました。 ...さらに読むと、リストは実際にはクラスではなくインターフェースであり、親クラスのArrayListはAbstractListです。それは私のために多くを明確にしていませんでした。

狂気私を運転しているもう一つのビット

:別のフォーラムの投稿では、賢明コーダは私にObservableListインタフェースを介してアクセス可能な私のArrayListを支援するためのコードのスニペット与えた:

List<myClass> myList = new ArrayList<myClass>(); 

をしながら宣言し、初期化するこの方法ArrayListはコンパイルされ、うまく動作しますが、私はここで何が起こっているのか分かりません。 ListはInterfaceであり、Classではないと思ったので、どのようにList型のmyListオブジェクトを作成できますか?私が推測しなければならないのは、Listという名前のインターフェースと別のClassというListという名前のクラスがあり、ここでのコンテキストのために、Javaはクラスを指していると仮定します。

私はこのトピックについて相談することをお勧めする推奨ウェブサイトやテキストがありますか?私は「Java in a Nutshell」、Oracle Webサイト、このサイトのさまざまな記事、「Java for Dummies」、および「Java in a Nutshell Examples」を読んでいますが、まだ照明はありません。このトピックを理解するためのガイダンスは大変歓迎されます。

多くの感謝! -RAO

+0

申し訳ありませんが、私は投稿する前にフォーラムを検索し、重複した投稿であるとは思わなかった。 – Pete

答えて

1

ブリーフ(そう簡単に)履歴書:

java.util.Listはインターフェイスです。つまり、そのインタフェースを実装するすべてのクラスがコード化する必要がある(抽象クラ​​スを除く) java.util.ArrayListは、そのインタフェースを実装するクラスです

実装できないため、実装クラス(fi ArrayList )しかし、あなたはそれを背後にある本当のクラスが何であるかに関係なく、インターフェイスとして管理することができます。あなたはクラスがインターフェイス内のすべてのメソッドを実装していることを知っているだけです。だから、

List<myClass> myList = new ArrayList<myClass>(); 

はちょうどあなたがリスト(実際のArrayList)をインスタンス化していることを意味し、それはあなたがjava.util.Listインターフェイス

で定義された方法でそのリストを管理しようとしていることを意味し

linkインターフェイスの操作の詳細については

+0

こんにちはホルヘ、私がこれを読んだとき、電球が私のために外に出ました。あなたの答えは、ArrayListオブジェクトの上に置かれたList型のインタフェースを、ある種のマスクのように考えるようになりました。 Objectface/Classの上にあるIntefaceの「フィット」を知ることで、そのオブジェクトで作業することができます。ああ!とても素晴らしい、ありがとう! – Pete

1

複数の書籍や記事があなたに役立っていない場合は、多分別の見方があります。あなたが概説されてきたの文を見てみましょう:

List<myClass> myList = new ArrayList<myClass>(); 

あなたが実際にここにリストをインスタンス化していません。 ArrayListというオブジェクトを参照していて、そのオブジェクトの型がListの参照をインスタンス化しています。これは、myListを使用している場合、参照するオブジェクトがArrayListであっても、コンパイラはそのオブジェクトをListとして扱うことを意味します。この行は、コンパイラが参照型に対してインスタンス化に見えると言って、「はい、このArrayListListであり、したがって、これは合法である。(Doing this allows you to ensure type safety by always havingはmyList conform to type一覧, no matter what kind ofそれが参照List`)のでArrayList

。コンパイルですListそれはListインタフェースを実装しているため。しかし、インタフェースはそのメソッドを定義するものではありません。私たちはこれを行うときに何が起こる?

myList.add(myObj); 

ここでそれが起こるかの簡易版だ。コンパイラはmyList.addを見て言います"はい、はmyListはListあり、そしてListは方法addを持っているので、このコードは動作します。」まあ、Listは(方法は基本的に抽象的である)、それがどのように動作するか定義していないので、このアクションは、実際に実行あるとき、それオブジェクトがリストのタイプである、ArrayListを探します。これは、マシンにリストの最後にオブジェクトを追加するよう指示します。そしてそうです。 (これは、インターフェイスを実装するときにインターフェイスのすべてのメソッドを定義する必要がある理由です)。

このストーリーフォームの回答は完全に正確だとは言えませんが、クリックすると役立ちます。

+0

それは助けてくれます、ありがとう!とても有難い...! – Pete

関連する問題