1

私は最近、Java を独学するために数冊の本を読んでいますが、幸いなことに、ほとんどが運のおかげで、ほとんど問題に遭遇しませんでした。それが変わったのです。

継承の下の次のセクションと、スーパークラスのサブクラスのセットアップ全体を読みました

-- 新しいスーパークラス オブジェクトが作成されると、すべてのオブジェクトと同様に参照 (この例では superReference) が割り当てられます。

-- 新しいサブクラス オブジェクト (スーパークラスを拡張するサブクラスを定義) が作成され、元のオブジェクトではなくそれを参照するように superReference 参照が設定されている場合、参照はスーパークラスに対して行われるため、それは私の理解です。 、スーパークラスによって定義されたメンバーのみがサブクラスからアクセスできます。

最初に - これは正しいですか?

2番目:メソッドをオーバーライドしているため、スーパーに1つ、サブに1つあり、スーパークラスオブジェクトを作成し、上記のようにその参照をサブクラスオブジェクトに割り当てます。動的などと呼ばれる原則によってメソッドディスパッチ、呼び出されたオーバーライドされたメソッドは、デフォルトでサブクラスメソッドにアクセスする必要がありますか?

さて、私の質問は次のとおりです。

スーパークラスオブジェクトへの参照がサブクラスオブジェクト用に作り直され、サブクラス定義メンバーへの object.member の直接アクセスを拒否し、スーパークラス定義メンバーのみをサポートする場合、スーパークラス参照がサブクラスオブジェクト用に作り直された場合、どうすればよいでしょうか? superclass-originated-reference によってアクセスが制限されている場合、オーバーライドされたメソッドがサブクラス オブジェクトに適用されます。

4

3 に答える 3

4

次のように試してみると:

class SuperClass{
    int intVar = 0;
    void method(){
        //in super class
    }
}
class SubClass extends SuperClass{
    int intVar = 2;
    void method(){
        //in sub class
    }
}

それで

SuperClass obj = new SubClass();
int val = obj.intVar;// this is taken from SuperClass as variables are decided on reference basis
//if both superclass and subclass contain the same variable it is called shadowing
obj.method();// it is taken from the SubClass as it is method overriding 
//and is decided at runtime based on the object not the reference  

コメントを確認します。お役に立てれば。

于 2013-05-13T03:55:59.897 に答える
1

Oracleのドキュメントでは、それについて言及していないか、少なくとも明確ではないか、明示的に説明されていません。この動作は C++ の仮想メソッドのように思えますが、そのような言語では、基本クラスまたは親クラス (Java のスーパークラス) で定義されたメソッドの前にキーワードvirtualを使用することで明確になり、子で再定義する必要があります。クラス。C++ には仮想変数はなく、仮想メソッドだけです。

その場合、子クラスのインスタンスを指す基底クラスへのポインター (参照) があり、同じ署名を持つメソッドと、親クラスと子クラスの両方に同じ名前の変数がある場合、実行されるメソッドは、キーワードvirtualが前にない場合、親クラスのメソッドです。一方、子クラスの定義は、virtualとして宣言されたメソッドに対して実行されます。

変数の場合、子クラスの変数ではなく、基本クラスの変数が使用されます。

再開すると、類似点は次のとおりです。

-Javaでは、参照に基づいて変数が取得されます -C++では、仮想変数はありません

したがって、私たちが話している場合、子クラスまたはサブクラスの非表示変数は取得されませんが、非表示の

-Java では、メソッドはオブジェクトまたはインスタンスに基づいて取得されます -C++ では、子クラスで仮想メソッドを再定義する必要があり、それらが取得されます

于 2015-02-11T02:24:18.643 に答える