0

このコードを見てみましょう:

package rpg;

interface A {
    // An empty interface
}

public class WarriorClass extends CharacterClass implements A {

    final int bab;
    public WarriorClass(int a) {
        bab = a;
    }

    public static void main(String[] args) {
        A a = new WarriorClass(1);
        System.out.println(((WarriorClass) a).bab);
    }
}

最初の質問: インターフェイスAを の型として使用できるのはなぜaですか? 2 番目の質問: A は iVar について知らないので、babなぜ

System.out.println(((WarriorClass) a).bab);

正しい値を出力します1か?

4

3 に答える 3

3

クラスをインターフェースの「中に」保存しません。インターフェイス クラスの変数にクラスへの参照を格納しています。

Java は参照でのみ機能します。すべて同じ長さです (C のポインターのように)。参照は型付けされているため、適切なクラスのオブジェクトを割り当てる必要があります。

関係に関して言えば、クラスを拡張したりインターフェースを実装したりするということは、新しいクラス オブジェクトが元のクラスにも属することを意味します。したがって、すべてのオブジェクトは のインスタンスですObject。拡張/実装することにより、新しいクラスがスーパークラス/インターフェースの契約 (仕様) に従うことを確認するため、それらはそれに属します。

于 2012-09-01T10:16:37.577 に答える
1

説明をどこまで下げたいですか?

類推のレベルにとどまるA aということは、「ここに、A/implements A であるすべてのものを入れることができる場所があることを意味します。それを適合させる方法があります。

作成したオブジェクトはそのインターフェイスを実装しているため、機能します。

この時点で、 anyAで実行できることはすべて安全に実行できますa(全体がばらばらになることはないので安全です。egaが null の場合でも例外をスローできますが、だますことはできません)。Aメソッドを持たないオブジェクトのメソッドを呼び出すコードを生成するコンパイラ)。

後で、もう一度 WarriorClass にキャストします((WarriorClass)a)。これは、 に何が起こるかを調べますa。null の場合、結果は null です。それが実際に であるオブジェクトである場合WarriorClass、結果はそのオブジェクトとしてアクセスされます。の別の実装でAある場合、例外が発生します。

下位レベルでは、どちらの場合も に格納されている参照がありaます。コンパイラは、絶対に不可能なこと (たとえば) を実行しないようにします。A a = "abcde";参照は、実際には、そのオブジェクトにアクセスできるようにするための単なる数値です (結局のところ、すべてはコンピュータにあります)。

メソッドを呼び出すと、その番号がパラメーターとともにAメソッドに渡されます (ここから が取得されます)。this

キャストを行うと、オブジェクトは上記のように検査されます。結果は、オブジェクトへのアクセスを許可する別の数値 (場合によっては同じ数値) になりますが、この場合、プログラムはその数値が a WarriorClass(または null) を参照していることを認識しています。したがって、コードでそれを呼び出すことができ.babます。不可能な状態につながることはありません。null の場合、通常のチェックでは、a実際にはでなかっWarriorClassた場合、キャストしようとしたときにスローされたことがわかります。この時点で、プログラムは を実装している別のクラスではないことを 100% 確実に認識していますA

于 2012-09-01T10:28:27.803 に答える
0

最初の質問に対する答え: 変数は型として宣言し、宣言されたもののサブタイプとしてインスタンス化できます。

2 番目の質問に対する回答: キャストを行っています。つまり、変数 a がキャスト先の型であることを明示的に示しているため、現在のコンテキストでアクセスできる任意の変数またはメソッドを使用または呼び出すことができます。 .

于 2012-09-01T10:16:35.403 に答える