抽象クラスでは、メソッドが両方とも抽象であるかどうかを理解しています。しかし、「通常の」非抽象クラスで抽象メソッドを作成できないのはなぜですか?
事前に説明をありがとう!
抽象クラスでは、メソッドが両方とも抽象であるかどうかを理解しています。しかし、「通常の」非抽象クラスで抽象メソッドを作成できないのはなぜですか?
事前に説明をありがとう!
なぜ抽象メソッドのようなものが必要なのかを理解することから始めましょう。答えは簡単です。エクステンダーにメソッドをそのまま使用させたくありません。特定のメソッドの独自の動作を定義してもらいたいのです。このメソッドは、抽象クラスの他のメソッドで使用するためです。抽象クラスに/ ** Java doc ** /を提供し、デフォルトの動作を使用するように指示できます。
class abstract LoveTheWorld {
private int myKindness ;
public int defaultGiveKindness() {
myKindness -= 5 ;
return 5 ;
}
/**
you can use the defaultGiveKindness method, and not define your own behavior
**/
public abstract int giveKindness() ;
}
これは、エクステンダーに、1 つのクラスのみを拡張できることも伝えます(Java 継承規則に従って)。ここで、この話をひねりたい場合は、抽象クラスの代わりにインターフェイスを使用できます。しかし、それはすべて、将来の開発者が遵守したい制約 (厳密または柔軟) に依存します。厳格は厳格に保ち、間違いを減らし、柔軟は緩く自由に保ち、イノベーションを促進します。質問は **何が必要ですか*8 です。
抽象メソッドを使用すると、クラスがインスタンス化されなくなり、事実上の抽象クラスになります。Java は、一貫性のためにこの事実を明示的に宣言することを主張します。技術的には、Java コンパイラは、クラスが抽象メソッドの存在に基づいて抽象であるかどうかを判断するためにこの追加のマークを必要としませんが、作成せずにクラスを抽象化したい場合があるためです。そのメソッドはどれも抽象化されており、クラスでの宣言が必要でした。
具象クラスが抽象メソッドを持つことができる場合、そこからオブジェクトを作成することはできません。Shape
を具体的なメソッドgetColor()
と抽象的なメソッドで想像してみてくださいdraw()
。抽象的な方法でいくつかのことを参照するのは素晴らしいことです。そうすれば、誰かがあなたに「形をレンダリングしてください!」と言うことができます:
public void render(Shape s) { ... }
しかし、その参照を call に使用する場合、によって参照されるオブジェクトがそれを行う方法を知っているdraw()
ことを期待します。s
s.draw();
具象クラスが抽象メソッドを持つことが許可されている場合、Shape オブジェクトをインスタンス化できますが、draw メソッドを呼び出すと、何を描画するかわかりません! 色や位置、その他1000のことを言う方法を知っていたとしても。100% 指定されていないと、作業オブジェクトとして存在できません。
そのため、Java では、そのようなクラスを抽象としてマークする必要があります。オブジェクトから期待されることの 100% を具体的に行う方法がわからないため、それらを使用してオブジェクトを作成することはできません。それらを参照するには、抽象クラスのみを使用できます。すべてのメソッドが実装されているクラスのみがオブジェクトの作成に使用され、おそらくあまり抽象的ではない名前が付けられていることを確認できます。
Shape shape = new Rectangle();
render(shape);
これで、「形状をレンダリングする」と言うことができ、長方形への参照を使用してプログラムを作成し、その方法を知ることがdraw()
できます。
実装を提供するメソッドを呼び出す必要があります。これがプログラミングの本質です。
この考えに基づく Java ルールは次のとおりです。
Java で非抽象クラスのインスタンスでメソッドを呼び出せるとしたら...メソッドはabstract
=>まったく意味がないため、実装はありません。
そのため、Java や、C# (仮想メソッド) などの同様のメカニズムを扱う他の言語では、非抽象クラスで抽象メソッドを宣言することを禁止しています。
抽象メソッドを持つと抽象クラスになるからです。推論は循環的です。
抽象メソッドは、実装を子クラスに任せるためのものです。通常のクラスに抽象メソッドが含まれている場合、そのクラスのオブジェクトを作成でき、通常のメソッドと同じように抽象メソッドを呼び出すことができます。その後、問題が発生します。理由は、抽象メソッドが抽象クラス (抽象クラスのオブジェクトを作成できないようにするため) またはインターフェイスのみにある必要があるためです。