web-dev-qa-db-ja.com

なぜ抽象メソッドは抽象クラスでのみ宣言できるのですか?

抽象クラスでは、メソッドが両方とも抽象であるかどうかを理解しています。しかし、なぜ「通常の」非抽象クラスで抽象メソッドを作成できないのでしょうか。

説明してくれてありがとう!

20
Jona

Abstractメソッドは基本的に、メソッドの実装はなく、サブクラスで実装する必要があると述べています。ただし、abstractメソッドがnon-abstractクラスにある場合、クラスをインスタンス化してオブジェクトを取得できますが、実装されていないメソッドがあり、これを実行することはできません。呼び出す。

30
Warlord

whyabstractメソッドのようなものが必要な理由を理解することから始めましょう。答えは簡単です。 extendersにメソッドをそのまま使用させたくありません。特定のメソッドの独自の動作を定義してもらいたいです。私の抽象クラスの他のメソッドでこのメソッドを使用しているので。 /**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() ;
}

これはまた、extenderに、1つのクラスのみextendできることを伝えます(Java inheritanceルール)これで、この話をひねりたい場合は、抽象クラスの代わりにインターフェースを使用できます。しかし、それはすべて、将来の開発者が遵守する制約、厳密またはflexibleStrictはそれをタイトに保ち、ミスを減らします、flexibleはそれを緩やかで自由に保ち、促進します問題は**何が必要か* 8です。

3
Siddharth

抽象メソッドがあると、クラスがインスタンス化されなくなり、事実上の抽象クラスになります。 Java一貫性を保つためにこの事実を明示的に宣言することを主張します:技術的には、Javaコンパイラは、クラスが抽象メソッドの存在。ただし、メソッドを抽象化せずにクラスを抽象化したい場合があるため、クラスでの宣言を要求する方法がありました。

3
dasblinkenlight

したい実装を提供するメソッドを呼び出す、それがプログラミングの本質です。

このアイデアに基づいて、Javaルールは次のとおりです。

  • あなたはできない抽象クラスをインスタンス化します。
  • のみ可能非抽象クラスをインスタンス化します。

Javaでは、メソッドがabstract => 意味がないため、実装なしで非抽象クラスのインスタンスのメソッドを呼び出すことができます。まったく

JavaおよびC#(仮想メソッド)のような同様のメカニズムを扱う他の言語は、非抽象クラスで抽象メソッドを宣言することを妨げる理由です。

1
Mik378

具象クラスに抽象メソッドがある場合、それからオブジェクトを作成することはできません。具象メソッドgetColor()と抽象メソッドdraw()を持つShapeを想像してみてください。 参照を抽象的な方法でいくつか説明するのは素晴らしいので、誰かが「形をレンダリングする!」

_public void render(Shape s) { ... }
_

しかし、その参照を使用してdraw()を呼び出す場合、sによって参照されるオブジェクトがその方法を知っていることが期待されます。

_s.draw();
_

具象クラスが抽象メソッドを持つことを許可されている場合は、Shapeオブジェクトをインスタンス化できますが、drawメソッドを呼び出すと、何を描画するかわかりません。その色、位置、その他1000のことを言う方法を知っていても。 100%指定されていない場合、作業オブジェクトとして存在できません。

したがって、Javaでは、そのようなクラスを抽象としてマークする必要があります。その後、それらを使用してオブジェクトを作成することはできません。オブジェクトから期待するものです。それらを参照するには、抽象クラスしか使用できません。すべてのメソッドが実装されているクラスだけがオブジェクトの作成に使用され、おそらくあまり抽象的ではないように見える名前を持つことになります。

_Shape shape = new Rectangle();
render(shape);
_

これで、「形状をレンダリングする」と言うことができ、長方形への参照を使用してプログラムすると、それをdraw()する方法がわかります。

1
helderdarocha

抽象メソッドは、実装を子クラスに任せるためのものです。通常のクラスに抽象メソッドが含まれている場合は、そのクラスのオブジェクトを作成して、通常のメソッドと同じように抽象メソッドを呼び出すことができます。問題が発生します。それが理由抽象メソッドは、抽象クラス(抽象クラ​​スのオブジェクトを作成できないようにする)またはインターフェイスのみにある必要があります。

0
Gundamaiah

簡単な答えは、クラスが抽象(コンクリートクラス)でない場合、そのクラスをインスタンス化してそのクラスの任意のメソッドを呼び出すことができる可能性がありますが、その非抽象クラスで抽象メソッドを宣言した場合、それを行うことは不可能ですその特定の抽象メソッドを呼び出します。 (それを防ぐために、非抽象クラスで抽象メソッドを宣言することはできません)

0

抽象メソッドを持つことは、それを抽象クラスにするからです。推論は循環的です。

0
user207421