2017-05-12 12 views
-7

を作成し、私は同じ参照して、異なるクラスからオブジェクト

Bが

を拡張し、また、私は

a1 = new B(); 

を以下ならば何が起こるか

A a1 = new A(); 
A a2 = new B(); 

との違いを知りたいですありがとう。

+0

何が起こっているか知りたい場合は、log/printステートメントで簡単なテストを実行して実行してみてください。また、OOPの基本原則である継承と多型についても読んでおく必要があります。 – lax1089

答えて

1

あなたは、A a1は、タイプAのオブジェクトへの参照である、とA()がクラスBのサブクラスA場合A.

の新しいインスタンスを作成し、コンストラクタへの呼び出しで、最初の行A a1 = new A();を取るためにa1 = new B();と書くことができます。なぜなら、a1はタイプAのオブジェクトへの参照であり、新しいBはAという「契約」をフルフィルにするために必要なすべてのメソッドを持つからです。しかし、特定のものを直接呼び出すことはできません参照はタイプAであるため、

BTWのように、このトピックの非常に短い説明であり、何らかのtutoria l。

編集:ここでは類推/例です:(FerrariWithSunRoofFerrariを拡張)

Ferrari A = new Ferrari(); 

Ferrari B = new FerrariWithSunRoof(); 

BがFerrariとして参照されているので、あなたは、たとえば、B.openSunroof()を呼び出すことができませんでしたので、参照は概念がありません。 (実際のインスタンスにサンルーフがある場合でも)。そのためには、あなたがFerrariWithSunRoof、すなわちとしてそれを参照する必要があると思います。:

FerrariWithSunRoof B = new FerrariWithSunRoof(); 
+0

ありがとうございますので、A a1 = new A(); A a1 = new B()である。違いは何ではない、私は私のIDEで試してみたし、違いは見えませんでした。 – Ala

+0

最初のインスタンスはAの新しいインスタンスを作成し、2番目のインスタンスはBの新しいインスタンスを作成します。 –

0

あなたはA1またはB1オブジェクトにクラスAまたはBのオブジェクトを使用して変更することができます。あなたはまず、私がread on OOP inheritance and interfacesにあなたをお勧めしますクラスA

Class A    Class B 
.move()    (.move()) inheritance 
.walk()    (.walk()) inheritance 
.run()    (.run() ) inheritance 
        .jump() 
        .dance() 

if you have an object like a1= new B() or a1=new A(); 
it works good for them both: 
a1.move() 
a1.run() 

but this works just a1= new B() 
a1.jump() 
+0

答えをありがとう!しかし、a1.jumpが動作することは確かですか? a1はAとして参照されます!私は例で試してみましたが、悲しいことにそれは仕事をしませんでした。これも上記のスティーブの答えと矛盾しています! – Ala

0

には存在しないよりも、クラスBからの新しいメソッドを使用しようとすると問題があります。

今質問します。 A a1 = new A();は、Aのために定義されたコンストラクタを呼び出し、タイプAの新しいオブジェクトを生成し、それ自身の参照をメモリに格納します。あなたがタイプABAを拡張するなどa2を定義しているので、 A a2 = new B();しか行うことなく、Aで定義されたメソッドにアクセスする必要があります、しかし、ちょうどa1のように、新しい参照してa2をタイプBの新しいオブジェクトa2を作成します。明示的なキャスト

a1 = new B();は、単にa1を新しいオブジェクトで上書きします。 ランダムアドレスでa1がcurrent_a1としてメモリに格納されていると仮定します。これは、a1 = new A();でプログラムを作成したとき、プログラムがa1 = new B();に達するとcurrent_a1はnew B()のアドレスに設定され、最終的には、それ。

例:

A a1 = new A();   a1 -> address_1 
a1 = new B();   a1 -> address_2 
address_1 is freed from memory if it isn't being pointed to/"used" anywhere else 

私はこれが役に立てば幸い!そして、次回は、質問をする前に、より深い検索をしてください。

関連する問題