8

参照変数は、クラスタイプまたはインターフェイスタイプとして宣言できます。変数がインターフェイスタイプとして宣言されている場合、インターフェイスを実装する任意のクラスの任意のオブジェクトを参照できます。

上記のステートメントに基づいて、私は理解に関するコードを作成しました。上記でインターフェイスタイプとして宣言されているように、インターフェイスを実装する任意のクラスの任意のオブジェクトを参照できます

しかし、私のコードでは、displayName()未定義のメソッドを次の場所に表示していますobjParent.displayName()

public class OverridenClass {
    public static void main(String[] args) {
        Printable objParent = new Parent();
        objParent.sysout();
        objParent.displayName();
    }
}

interface Printable {
    void sysout();
}

class Parent implements Printable {
    public void displayName() {
        System.out.println("This is Parent Name");
    }

    public void sysout() {
        System.out.println("I am Printable Interfacein Parent Class");
    }
}

私は間違った方法を理解したと確信しています。誰かが同じことを説明できますか?

4

6 に答える 6

9

しかし、私のコードでは、displayName()メソッドが未定義で表示されています。

そうです、インターフェースdisplayNameで定義されていないからです。Printable具象クラスに追加のメソッドがある場合でも、そのインターフェースを持つと宣言された変数を介してのみ、インターフェースで定義されたメソッドにアクセスできます。そのため、を呼び出すことはできますがsysout、呼び出すことはできませんdisplayName

このような例を検討すると、この理由はより明白になります。

class Bar {
    public static void foo(Printable p) {
        p.sysout();
        p.displayName();
    }
}

class Test {
    public static final void main(String[] args) {
        Bar.foo(new Parent());
    }
}

のコードは、コンパイル時に具象クラスが何であるかわからないため、インターフェイスで機能するもの以外のものに依存してはfoo なりません。Printable

インターフェイスのポイントは、使用されている具象クラスに関係なく、インターフェイス参照のみを使用してコードで使用できる特性を定義することです。

于 2013-02-21T08:01:29.777 に答える
3

タイプとして宣言されており、インターフェイスにそのようなメソッドがないため、displayName()メソッドは未定義として表示されます。メソッドを使用できるようにするには、インターフェイスで宣言できます。objParentPrintabledisplayName()Printable

interface Printable {
    void sysout();
    void displayName();
}

または、メソッドを呼び出す前に最初にobjParent型にキャストします。ParentdisplayName()

Printable objParent = new Parent();
objParent = (Parent) objParent;
objParent.displayName();
于 2013-02-21T08:08:43.350 に答える
2

Parentメソッド にアクセスするには、型キャストする必要があります

((Parent)objParent).displayName();
于 2013-02-21T08:02:32.713 に答える
1

コンパイラは実行時を気にしません。コンパイラーに関する限り、参照型にインターフェース型にdisplayというメソッドがあるかどうかをチェックします。

サブクラスまたは実装クラスで宣言されたメソッドは、スーパークラス/インターフェイスの一部ではありません。したがって、スーパークラス/インターフェイス参照型のサブクラスで宣言されているメソッドを呼び出すことはできません。

于 2013-02-21T08:02:18.657 に答える
0

インターフェイスは基本的に別の方法です-単一継承のルールを破ります。

インターフェイスを使用することにより、子クラスはその親メソッドを継承し、そのインターフェイスメソッドを実装するように強制することができます。継承ツリーなどの拡張と保守が容易になります。

ただし、子が親の下で参照されている場合は、親メソッドにしかアクセスできません。インターフェイスメソッドにアクセスするには、インターフェイス参照型で子をキャストまたは作成する必要があります。

インターフェイスを使用すると、さまざまなファミリの複数のクラスをインターフェイスタイプで収集することもできます。私がまだ発見していない利点は何ですか。

私の意見では、親参照型を使用するだけでは、とにかく完全なポリモーフィズムを達成することはできず、インターフェイスの実装にアクセスできるため、意味がありません。

于 2014-08-07T13:30:06.220 に答える
0

メソッドシグネチャが存在する場合は常に、そのインターフェイスの参照でエラーが発生することはありません。あなたの例では、メソッドsysout()はインターフェースにあるので、インターフェースの参照はエラーを出しませんが、メソッドdisplayName()の場合、インターフェース参照はエラーを出します。そのためには、クラス参照を使用する必要があります。

于 2018-07-28T09:24:11.523 に答える