3

私は、Java Web サイト
Using Interface as a type
で提供されている Interface の章を見ています。 したがって、私の理解では、インターフェイスの全体的なポイントは、クラスのようなものですが、そこからオブジェクトを形成することはできませんが、このページでは、インターフェイスをデータ型として使用します。この行は、インターフェイスであるRelatable obj1 = (Relatable)object1;タイプのオブジェクトを作成しているようです。ここではキーワードが使用されていないため、 type のオブジェクトへの参照を実際に作成していRelatableないと言わざるを得ません。この行がタイプのオブジェクトを作成していないのは本当に原因ですか? newRelatableRelatable

繰り返しますが、それはさらに言います

さまざまなクラスで Relatable を実装することを強調する場合、それらのクラスのいずれかからインスタンス化されたオブジェクトを findLargest() メソッドと比較できます (両方のオブジェクトが同じクラスである場合)。

これは何を意味するのでしょうか?これは、implementsRelatableが呼び出すことができるものを意味しますfindLargest()か? もしそうなら、なぜそれは言うのprovided that both objects are of the same classですか?

----- 編集 -----
このチュートリアルの前の章から:
関連性の定義:

public interface Relatable {

    // this (object calling isLargerThan)
    // and other must be instances of 
    // the same class returns 1, 0, -1 
    // if this is greater // than, equal 
    // to, or less than other
    public int isLargerThan(Relatable other);
}  

タイプとして relatable を使用する:

public Object findLargest(Object object1, Object object2) {
   Relatable obj1 = (Relatable)object1;
   Relatable obj2 = (Relatable)object2;
   if ((obj1).isLargerThan(obj2) > 0)
      return object1;
   else 
      return object2;
}

----- EDIT 2 -----
匿名クラスの章では、これを行います:

public class HelloWorldAnonymousClasses {

    interface HelloWorld {
        public void greet();
        public void greetSomeone(String someone);
    }
.
.
.
 HelloWorld englishGreeting = new EnglishGreeting();

        HelloWorld frenchGreeting = new HelloWorld() {
            String name = "tout le monde";
            public void greet() {
                greetSomeone("tout le monde");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Salut " + name);
            }
        };

では、これはどのように機能するのでしょうか。

4

5 に答える 5

4

行 Relatable obj1 = (Relatable)object1; タイプ Relatable のオブジェクトを作成しているようです

いいえ。この行は、タイプの参照(obj1) を作成し、Relatableそれを に割り当てobject1ます。これを機能させるには、(インターフェイス) typeobject1キャストRelatableする必要があります。
ここでは新しいオブジェクトは作成されていません。

これは、Relatable を実装するものはすべて findLargest() を呼び出すことができるということですか?

はい。

もしそうなら、なぜ両方のオブジェクトが同じクラスであると言うのですか?

の実装に関係していますisLargerThan()。インターフェイスを実装するクラスはRelatable、それを実装する他のクラスについて何も知ることができないため、他のクラスと意味のある比較を行うことはできません。したがって、これが機能するには、両方のオブジェクトが同じクラスである必要があります。

EDIT 2への応答

では、これはどのように機能するのでしょうか。

の場合のように、最初にクラスを定義してからそのインスタンスを作成する代わりに、EnglishGreetingfrenchGreetingその場で作成されます。裏で何が起こっているかとHelloWorldいうと、英語の場合と同じように、実装する新しいクラスが作成されますが、今回は匿名です (名前を付けることはできません)。これは、インターフェイスの 1 回限りの実装が必要な場合の便利なショートカットです。

于 2013-07-22T09:27:56.860 に答える
3

インターフェイス型は、Java の参照型のカテゴリに属します。インターフェイスをインスタンス化することはできませんが、それを実装するクラスの任意のオブジェクトへの参照を割り当てることができます。

宣言された型がインターフェイス型である変数は、指定されたインターフェイスを実装するクラスの任意のインスタンスへの参照を値として持つことができます。

インターフェイスはビヘイビアのようなものです。クラスがたまたまインターフェースを実装した場合、たとえばSerializable、これによりクラスに動作が追加されます。つまり、クラスをシリアル化できます。

これは、コードに抽象化を導入するのに役立ちます。たとえば、シリアライゼーションの実際のジョブを担当するユーティリティ クラスの 1 つにメソッドが必要であると仮定します。インターフェイスがないと、シリアル化するオブジェクトの種類ごとに 1 つずつ、多くのメソッドを作成することになります。serializeここで、これらの各オブジェクトに (実装したインターフェイスで宣言されたメソッドを実装することによって) シリアル化を自分で処理するように依頼した場合を想像してください。このような実装では、シリアル化のためのユーティリティ メソッドを 1 つだけ記述する必要があります。このメソッドは型の引数を取ることができ、Serializableこのインターフェイスを実装する任意のクラスのインスタンスをメソッドに渡すことができます。メソッド内で呼び出す必要があるのは、serializeインターフェイス変数のメソッド。実行時に、これにより実際のオブジェクトのserializeメソッドが呼び出されます。

シンプルに保つことができたことを願っています。

于 2013-07-22T09:35:32.257 に答える
2

インターフェイスは、オブジェクトの動作を定義する単なるクラスですが、その下にある実装ではありません。object1Relatable obj1 = (Relatable)object1;を Relatable 型にキャストするだけなので、 Relatable インターフェースで定義された任意のメソッドを呼び出すことができます。

于 2013-07-22T09:29:20.587 に答える
2

Javaのインターフェースは、インターフェースを実装するクラスの相互構造であるため、クラスは独自の方法でそのインターフェースのメソッド/他のメンバーから恩恵を受けます。これはポリモフィズムと呼ばれます。

interface A
{
  // method header only declared here, so implementation can vary between classes
  public int foo(); 
}

class B implements A
{
   public override String foo()
   {
     return "Class B";
   }
}

class C implements A
{
   public override String foo()
   {
     return "Class C";
   }
}

foo()の両方を呼び出すことができますが、独自の方法でそのメソッドを実装しているため、反応が異なりますclass BC

于 2013-07-22T09:31:18.657 に答える
1

についての最初の質問Relatable obj1 = (Relatable)object1;:

simpleRelatable obj1;は Relatable のインスタンスを作成しませんが、それに割り当てられたオブジェクトは Relatable インターフェースを実装するタイプでなければならないことを指定します。

したがって、キャストされるオブジェクトは、Relatable インターフェースを実装するタイプでなければなりません。

于 2013-07-22T09:29:12.913 に答える