web-dev-qa-db-ja.com

Javaで抽象クラスをインスタンス化できないのはなぜですか?

わかります:

  1. Abstractクラスはそれ自体、つまり車両ではないため、Car、Bikeなどの具体的な実装のオブジェクトを作成する理由です。
  2. Abstractクラスのコンストラクターは、オブジェクトチェーン中に呼び出されます。

  3. コンストラクタが含まれ、すべてのメソッドが実装されている場合でも、Abstractクラスのオブジェクトを直接作成することはできません

どうして ?コンパイラの観点から理解したいのですが、なぜJavaはこれらを強制しますか?

ありがとう

13
sandejai

これは技術的な制限ではなく、むしろ(指摘したように)論理的な制限です。 Java(および他の多くの言語)は、破ることができないためではなく、これが言語の意図的な部分であるため、さまざまな規則を強制します。

12
Eli Iser

抽象クラスは完全ではありません!著者は、いくつかのコードに実装が欠落しているであることを伝えるために、アブストラクトにマークを付けました。作者はいくつかの作業を行いましたが、それを機能させるには自分でいくつかのビットを記入する必要があります。 abstractキーワードは、この不完全なクラスを誤って開始することがないようにします。

車の修理を考えてください。誰かがブレーキパッドを取り外し、翌日それらを交換する予定です。現在、誰かがこの車(ブレーキが取り付けられていない)を誤って運転するのを防ぐために、整備士はハンドルにロックを取り付けます。これはフェールセーフ対策です。

22
kevin

rocketboyは機械的な理由をいくつか示していますが、概念的な理由があります。

Abstractクラスは、抽象概念を表します。車両の例を見てみましょう。より具体的なものではない車両を構築することはできません。 2004カローラと'98フォードエスコートと1984 cs36(ヨットの一種)、マーク4ホタルクラス中距離バルク輸送機(スタビライザー付き)で構成される車両のセットを使用できます。それらのいずれかを個別に取得して車両と呼びますが、車両のみであり、それらのいずれかまたは他の特定のタイプの車両ではないものを使用することはできません。

抽象クラスは、ビークルなどの抽象概念を表します。したがって、インスタンスを作成するという考えは無意味です。実際にインスタンスを作成するには、何をインスタンス化しているのかを知る必要があるからです。

6
Taylor

抽象クラスは、new演算子を使用してインスタンス化できません。抽象には、抽象メソッド、つまり、本体(または実装)のないメソッドがあるためです。 オブジェクトは抽象メソッドを持つことができず、JVMは抽象メソッドのメモリを割り当てることができないため

4
alexvipul

抽象クラスはスケルトン構造(場合によっては不完全な構造)であるため、抽象という用語です。

_abstract class Person(){
   abstract void Speak();
}
_

すべてのPersonが話さなければならないことを意味します。つまり、すべての人が話す方法を知っている必要があります(speak()を実装します)。 new Person()はそれを持つことができないため、許可されていません。

2
rocketboy

オブジェクト指向モデルに反するため、インターフェイスまたは抽象クラスをインスタンス化することはできません。 続きを読む

1
Sunil S

抽象クラスに抽象(実装されていない空の)メソッドが含まれている可能性があることを理解しています。オブジェクトをインスタンス化して空のメソッドを呼び出すと、機能しなくなり、問題が発生する可能性があるため、コンパイラはこの規則を強制します。それ以上の洞察者?

1
sandejai

抽象クラスは、抽象として宣言されているクラスです。抽象メソッドを含む場合と含まない場合があります。

Wordの抽象キーを使用して、AbstractクラスとAbstractメソッドを宣言する必要があります。

抽象クラスはインスタンス化できません。つまり、抽象クラスのオブジェクトを作成することはできません。サブクラスを抽象クラスに作成できます。

抽象クラスには、抽象メソッドがある場合とない場合があります。本体実装なしでメソッドが宣言できるという意味での抽象メソッドは、抽象メソッドと呼ばれます。したがって、その場合、JVMは、抽象メソッドに本体実装がないため、その抽象メソッドに割り当てるメモリの量を認識しません。したがって、JVMは、抽象クラスにインスタンスを作成するときに、抽象メソッドにメモリを割り当てることができません。そのため、JVMは抽象クラスのインスタンスを作成できません。そのため、Abstractクラスのオブジェクトを作成できません。

すべての具象メソッドを持つ抽象クラスを作成することもできます。つまり、抽象メソッドもありません。その場合も、Abstractクラスのインスタンスを作成できません。理由は、abstractキーワードが単にクラスをインスタンス化できないことをJVMに示すためです。

Javaの設計者は、任意のクラスの抽象キーワードを見つけると、JVMはそのクラスのインスタンスを作成できないというJVMを作成しました。

1
Sumedh Tambat

それが自己を伝える抽象:思考またはアイデアとして存在するが、物理的または具体的な存在を持たない。 Java term、abstract keyword definition、abstractがクラス名の前にある場合、JDKはそのクラスオブジェクトの開始を破棄するようJVMに指示します。チェーン。

1
Rudra

抽象クラスをインスタンス化できます。具体的なサブクラスのみを提供する必要があります。

0
Srinath Shah

抽象クラスは不完全なクラスなので(本体と出力のない抽象メソッドを含むという意味で不完全です)、インスタンスまたはオブジェクトを作成できません。あなたがインターフェースに対して言うのと同じ方法。

0
Sonu patel

抽象クラスとインターフェイスのインスタンス化を制限するためにjvmが再生される非常に単純な理由。

コンパイラーが両方のインスタンス化を許可すると仮定します。

したがって、抽象クラスに5つの抽象メソッドが含まれ、メソッドプロトタイプのみがメソッド本体を含まないことを意味します。

したがって、jvm Javaスタック領域で別のスタックを作成するすべてのメソッド呼び出しを知っているように、そのメモリ割り当てはメソッド構造に基づいて行われ、実行後にそのスタックは破壊されます。

したがって、私のメソッドにボディが含まれていない場合は、jvmがどのようにメモリを予測してそのメソッドを割り当てることができるかを意味します

次に、ボディがない場合はメソッドの実行がないことを意味するので、Javaスタック領域から破棄することはありません。メモリアウトエラーが発生する可能性があります。

したがって、これらの2ケースコンパイラを考慮すると、インターフェイスと抽象クラスの両方のインスタンス化が制限されます

0
naila naseem

抽象クラスをインスタンス化することはできません。これは、クラスを拡張する構造をクラスに与えるだけだからです。

また、クラスを開始する場合、なぜabstractとして定義するのですか?

0
Ankita P.

Java制限されているため、抽象クラスをインスタンス化できません。一般的なシナリオでは、抽象は不完全であるため、不完全なオブジェクトを作成できないためです。抽象クラスを具象クラスに入れますが、抽象クラスのオブジェクトを作成することはできません。

0
Bharti Rawat