4

次のプログラムで。メソッドはタイプごとに動的に呼び出されます。しかし、変数を動的に呼び出すのはどうですか。なぜそうできないのですか?

class Super {

    public int field = 0;
    public int getField() {
        return field;
    }
}

class Sub extends Super {

    public int field = 1;

    public int getField() {
        return field;
    }

    public int getSuperField() {
        return super.field;
    }
}

public class FieldAccess {

    public static void main(String[] args) {
        Super sup = new Sub(); 
        System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());
        Sub sub = new Sub();
        System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField() + ", sub.getSuperField() = "+ sub.getSuperField());
    }
}

出力:

sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0

ここで、sup.method() が動的に見つかる場合、なぜ sup.variable を動的に取得できないのでしょうか?

出来ますか?そうでない場合はなぜですか?

(superclas)animal--->Dog、Cat、lion がある場合、そのメソッドを makeNoise() と呼び、bark または meow... それぞれ受け取ります。しかし、その名前を尋ねて、それに応じて取得してみませんか?

4

2 に答える 2

2

Java では、Java ではメンバー変数のポリモーフィックな動作が許可されていないため、メンバー変数には静的バインディングがあります。

privateメソッドは継承されず、コンパイラはコンパイル時にのみプライベート メソッドへの呼び出しを解決できるためです。したがって、静的バインディング。

次に、以下のコードを検討してください。

class SuperClass{
...
public String someVariable = "SuperClass";
...
}

class SubClass extends SuperClass{
...
public String someVariable = "SubClass";
...
}
...
...

SuperClass superClass1 = new SuperClass();
SuperClass superClass2 = new SubClass();

System.out.println(superClass1.someVariable);
System.out.println(superClass2.someVariable);
...

出力:- スーパークラス スーパークラス

メンバー変数は、オブジェクト参照の宣言された型のみに基づいて解決されます。これは、コンパイラーがコンパイル時にのみ検出できるため、この場合は静的バインディングになります。

要約すると、基本的に Java 開発者は、これらのチェックが実行時まで行われ、その時点で例外が発生することを望んでいませんでした。

于 2013-06-25T17:27:29.510 に答える
1

スーパークラスメソッドをオーバーライドしたように。

public int getField() {
        return field;
}
于 2013-06-25T17:41:27.380 に答える