2013-10-28 7 views
7

抽象クラスのオブジェクトを構築することはできませんが、抽象クラスであるオブジェクトの 参照を持つことができます。あなたが持っている場合は抽象クラスはどのようにしてオブジェクトを参照することはできませんか?

Account anAccount; // OK 
anAccount = new Account(); // Error—Account is abstract 
anAccount = new SavingsAccount(); // OK 
anAccount = null; // OK 
あなたは抽象クラスへのオブジェクト参照を持つことができる理由を理解していない

...

答えて

10

:もちろん、それが参照する実際のオブジェクトは、具体的なサブクラスのインスタンスでなければなりません その型が抽象クラスであるオブジェクト参照は、その参照が「抽象クラスを参照しています」という意味ではありません。代わりに、 "私はその抽象クラスのサブクラスである実際のオブジェクトを参照しています。"このため、Accountからサブクラスを持つ抽象クラスではないSavingsAccountを参照することができますが、Accountを実際にインスタンス化できないため、new Account()を指すことはできません。

参照自体は、抽象クラスの実際のインスタンスではありません。

希望すると便利です。

+0

だから、アカウントanAccountのようなことをするときは、それは何ですか?実際に何かを指しているわけではありませんか?抽象クラスでなくても、String tmpと言うことができます。まだアドレスを与えていないのですか? – user2809437

+0

@ user2809437-それは正しいです。 'Account anAccount'と言うと、最初は' null'を保持する 'anAccount'という参照があります。これは何も指していないことを意味します。 'String tmp'と同じです。 'String'への参照を取得しますが、まだ' String'を指し示さないので 'null'を指しています。 – templatetypedef

+0

もう1つ質問があります...これは何がポイントですか?クラスのインスタンスを作成できない場合、その両方の参照はなぜですか? – user2809437

1

問題は抽象メンバルーチンを呼び出すことができないことです。
'new'を呼び出すと、実際にクラスのコンストラクタを呼び出しています。
抽象メンバ関数を呼び出そうとしているので、エラーが発生します。

することができます。は抽象クラスを参照しています。これは、それが派生した実際のクラスの単なる青写真であるためです。インタフェースのように少し相性があります。
インターフェイスをインスタンス化できないように、抽象クラスをインスタンス化することはできません。

もちろんこれはpolymorphismの一部です。
抽象クラスとインターフェイスの違いは非常に小さいです:Interface vs Abstract Class (general OO)

関連する問題