3

以下に示す2つのクラスとインターフェイスがあります。簡単な要約:インターフェイスWinterface、Class Big、Class Littleは、Bigを拡張し、Winterfaceを実装します。

public interface Winterface {}


public class Big {

    public int hello = 88;

    public Big() {}

    public void theMethod() {
        System.out.println ("Big was here: " + (this instanceof Winterface) + ", " + this.hello);
    }
}

public class Little extends Big implements Winterface{

    private boolean hello = true;
    public Little(){}

    public void theMethod() {
        super.theMethod();
        System.out.println("Little was here: " + hello);
    }

    public static void main(String [] args) {
        Little l = new Little();
        l.theMethod();
    }
}

Littleでメインを実行すると、次の出力が得られます

ビッグはここにありました:本当、88リトルはここにありました:本当

私の質問は、どうすればいいですか

1)(Winterfaceのこのインスタンス)はtrueを返しますが、

2)this.hello be 88?this.hello = 88の場合、this = Bigであり、Winterfaceのインスタンスではありません。

どうすればこれが可能かわかりません、よろしくお願いします

編集:私が今理解しているすべての人に感謝します。「これ」は、大きなものであり、Winterfaceを実装する小さなものを指します。メソッドはsuper.theMethod()として呼び出されているため、「this」はほとんど参照していませんが、使用可能な変数「hello」はBigの変数です。

4

5 に答える 5

2

lですLittleLittleBig 動作も実装していますWinterface
super親クラスへの呼び出しであるため、親クラスのhelloメンバー (つまりBig) が使用されます。
あなたはしていませんthis.helloが、super.theMethod()それは親のクラスメンバー変数を使用していますhello

UPDATE:親クラスの対応するメソッドを呼び出します
。親クラスでは、親のフィールドにアクセスします( も であるため、派生クラスにもsuper.theMethod()属します)。したがって、その時点で、親クラスのコードの一部にアクセスしています。のメモリプリントは次 のよう に想像できます。LittleBigthis.hello
Little

++++++++
+ Big  +
--------
+Little+
++++++++  

そのLittleため、親のすべてのメンバー変数がありBig、コードが内部super.theMethod()で実行されると、の「コード領域」内で実行されますBig
ピーターが回答で述べているように、ポリモヒズムはメソッドではサポートされていません。この過度に単純化された説明がこれを理解するのに役立つことを願っています

于 2012-07-31T15:35:27.800 に答える
2

this1 つのクラスのみにすることができます。ただしthis.hello、そのクラスはフィールドにアクセスできます。

this1 つのクラスにしかできないため、Little親を持ち、Big実装するクラスWinterfaceです。その親でメソッドを呼び出すと、その親でしか見るhelloことができません。

つまり、Java はメソッドのポリモーフィズムをサポートしますが、フィールドはサポートしません。

于 2012-07-31T15:35:46.390 に答える
1

これは、this instanceof ...チェックが静的(つまり、コンパイル時)型(つまり)を使用せずBig、オブジェクトの(this')動的実行時型(つまり、this.getClass())を使用Littleするためです。静的型を使用する場合、次のようになるため、演算子はかなり無意味になります。

Object obj = "foo";

if (obj instanceof Object) { /* always entered */ }
/* but */ if (obj instanceof String) { /* never entered */ }

静的に、コンパイル時に。演算子の目的は、instanceof実行時型テストを有効にすることです。次に例を示します。

Object obj = /* whatever */;

if (obj instanceof String) {

    String str = (String)obj;   // Cast cannot fail
    ...

} else if (obj instanceof Long) {

    Long val = (Long)obj;       // Cast cannot fail
    ...
}

この手法は慎重に使用する必要があることに注意してください。

于 2012-07-31T15:38:46.113 に答える
0

変数はBigとLittleのインスタンスです。これはLittleの直接インスタンスですが、LittleはBigから継承するため、instanceof演算子はBigに対してもtrueを返します。

Little l = new Little();
System.out.println(l instanceof Little); // true, l is an instance Little
System.out.println(l instanceof Big); // true, l is an instance of Little which inherits from Big

他の誤解(私が推測している)は、「メソッドルックアップ」がどのように機能するかです。theMethodを呼び出すと、Littleによるそのメソッドの実装が選択されます。ただし、super.theMethodを呼び出すときは、「このメソッドのBigのバージョンを呼び出す」と明示的に言っており、そのメソッド内では、Littleのhello変数ではなくBigのhello変数を使用しています。

于 2012-07-31T15:40:08.657 に答える
0

ここで起こっていることは、 で変数を定義しているときに、hello内にある変数をLittle上書きしているのではなく、内に変数を隠している内で新しい変数を定義しているということです。したがって、 の範囲内では88 の整数値を参照し、 の範囲内ではtrueを参照します。これらは異なる変数であり、どちらもオブジェクト内に含まれています。唯一の違いは、それらを参照するスコープです。helloBighelloLittlehelloBigBighelloLittlehello

ここで他の人が言ったようinstanceofに、オブジェクトのランタイムタイプ(によって返されるものthis.getClass())を比較する演算子です。Bigオブジェクト内の変数のスコープが を参照する場合でもBigthisはまだランタイム タイプLittleであるため、 のインスタンスですWinterface

于 2012-07-31T15:53:26.683 に答える