2
class A{
int a=10;   
public void show(){ 
    System.out.println("Show A: "+a);
    }
}

class B extends A{
public int b=20;    
public void show(){
    System.out.println("Show B: "+b);
    }
}



public class DynamicMethodDispatch {

    public static void main(String[] args) {

    A aObj = new A();       
    aObj.show();    //output - 10

    B bObj = new B();
    bObj.show();   //output - 20

    aObj = bObj;   //assigning the B obj to A..         
    aObj.show();  //output - 20 

    aObj = new B();
    aObj.show();  //output - 20
             System.out.println(bObj.b);  //output - 20 
    //System.out.println(aObj.b); //It is giving error



     }
}

上記のプログラムでは、 aObj.bを呼び出そうとするとエラーが発生します。
1.クラスBを参照しているのに、aObjを介してその変数にアクセスできないのはなぜですか?
2.なぜshow()メソッドにアクセスできるのですか?

4

5 に答える 5

5

の静的タイプaObj実行時タイプを区別する必要がありますaObj

などのコード

A aObj = new B(); 

結果は、aObj静的型Aと実行時型の変数になりますB

コンパイラーは、何を許可するかを決定するときに、静的型を気にするだけです。

あなたの質問に:

1.クラスBを参照しているのに、aObjを介してその変数にアクセスできないのはなぜですか?

(一般に)実行時にオブジェクトを参照することをコンパイラが知る方法はないため、何らかの形式のオブジェクトを参照することだけがわかります。すべてのオブジェクトで使用できるわけではないため、コンパイラは「申し訳ないより安全である」と考え、許可しません。aObjBA.bA

2.show()メソッドにアクセスできるのはなぜですか?

このメソッドすべてのAオブジェクトで使用できるため(サブクラスで宣言されていない場合でも、から継承されAます)。

于 2012-05-15T07:00:15.773 に答える
2

aObjタイプのローカル変数ですA。サブクラスにのみ存在する、というAメンバーはありません。を使用する場合は、型の変数を宣言する必要がありますが、もちろん、インスタンス(またはサブクラスがある場合はサブクラス)のみを割り当てることができます。bBbBB

Aメソッドを宣言しshow()ますが、サブクラスの実装をオーバーライドしますB

于 2012-05-15T06:54:04.683 に答える
1

この動作はとして知られており、Javavirtual method invocationの重要な側面です。polymorphismこのチュートリアルをご覧ください。

于 2012-05-15T07:05:36.517 に答える
0

メソッドとフィールドには、異なるポリモーフィックな動作があります。

呼び出されるメソッドは、インスタンスの実行時型のメソッドです。

aObj=new B(); //new B()

呼び出されるフィールドは、宣言したタイプの参照のフィールドです。

A aObj = new A(); // A aObj

Aにshow()メソッドがない場合でも、次のように機能します。

aObj = new B();
aObj.show(); //calls B's show()
于 2012-05-15T07:03:32.660 に答える
0
class A{ // class A has variable a and method show();
int a=10;   
public void show(){ 
    System.out.println("Show A: "+a);
    }
}

class B extends A{ //class B inherits variables and methods of A.
   // so class B has variable a, b and show(). Also, show is overridden by class B.
public int b=20;    
public void show(){
    System.out.println("Show B: "+b);
    }
}
  1. Aには変数bが含まれていないため、uがBをAに渡している場合でも、変数bが含まれていないAオブジェクトがあります。したがって、bにアクセスしようとすると、コンパイル時エラーが発生します。

  2. show()の場合、AとBの両方にこのメソッドがあるため、ここで実行しているのは、実行時に実際にオーバーライドすることです。これはポリモーフィズムに他なりません。したがって、Aにはすでにメソッドshow()があり、後でBによってオーバーライドされるため、

A a = new B(); ショー();

これにより、実行時にBのshow()メソッドが実行されます。

于 2012-05-15T07:05:53.363 に答える