抽象メソッドなしで抽象クラスを定義する


回答:


168

もちろん。

クラスの抽象を宣言することは、それだけでインスタンス化することを許可しないことを意味します。

メソッドの抽象を宣言するということは、サブクラスがそのメソッドの実装を提供する必要があるということです。

2つは別々の概念ですが、非抽象クラスに抽象メソッドを含めることはできません。finalメソッドを含む抽象クラスを持つこともできますが、その逆はできません。


14

はい、できます。やってみませんか?


6
そしてそれはOPだけではありません。質問を受けたすべての賛成票を見てください!
Marc W、

54
@ karim79高い馬やソースを注ぐものは必要ありません。試してみても、なぜ許可されるのかは明らかにされていませんが、可能性は尋ねられます。
biziclop 2011年

7
@bizclop-自分で試してみると、より生産的な疑問が生じた可能性があります。高い馬はありません。これは非常に簡単です。彼の質問は、「なぜこれをするのか...」ではなく「私はできるのか」でした。
karim79 '27年

8
質問に単純な「はい」または「いいえ」で答えることができる場合、質問者は言い換え、Googleの使用、または単にそれを試すことを検討する必要があります。
タイラートリート

3
@ karim79ええ、質問はもっと上手く表現できたかもしれませんが、私は一歩先を見るためにそれほど多くの努力を払う必要はないと思います。
biziclop 2011年

8

はい、できます。Javaで使用される抽象クラスは、クラスのオブジェクトを作成できないことを示します。そして、サブクラスがそのメソッドの実装を提供する必要がある抽象メソッド。

したがって、抽象メソッドなしで抽象クラスを簡単に定義できます。

例として:

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

これで結構です。


6

はい抽象メソッドなしで抽象クラスを作成できます。抽象メソッドなしの抽象クラスの最良の例はHttpServlet
です。抽象クラスを宣言した場合、必須のBUTを抽象化します。クラス内で抽象メソッドを宣言することは必須ではありません。

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


4

はい、すでに実装されているメソッドのみでインスタンス化できないクラスを宣言できます。これは、将来的に抽象メソッドを追加する場合や、抽象プロパティがなくてもクラスを直接インスタンス化したくない場合に役立ちます。


問題は、空の抽象クラスではなく、抽象メソッドのない抽象クラスだけでした。完全に空の抽象クラスを使用するために私が見る限り、正当な理由はありません。
biziclop 2011年

1
回答を修正しました。空の抽象クラスを使用すると、後で抽象メソッドを追加する必要があり、他の親クラスをリファクタリングする必要がない場合に便利です。
Gordon Gustafson、2011年

1
階層の途中で、完全に空の(継承仕様を除く)抽象クラスは、そのクラスの派生物が親の他の派生物と異なる契約上の義務を負う場合に意味があります。
スーパーキャット2013

3

はい、抽象メソッドなしで抽象クラスを宣言できます。クラスを抽象として宣言する目的は、クラスをインスタンス化することではありません。

だから2つのケース

1)抽象メソッドを持つ抽象クラス。

これらのタイプのクラスでは、この抽象クラスからクラスを継承し、クラス内の抽象メソッドをオーバーライドする必要があります。例:GenricServletクラス

2)抽象メソッドのない抽象クラス。

これらのタイプのクラスでは、この抽象クラスからクラスを継承する必要があります。例:HttpServletクラス実行する目的は、子クラスにロジックを実装しない場合、親ロジックを取得できることです。

HttpServletソースコードを確認してください


2

どちらも独立した概念であるため、抽象メソッドなしで抽象クラスを作成できます。クラスの抽象を宣言すると、それだけでインスタンス化することはできず、サブクラス化することしかできません。メソッドの抽象を宣言することは、メソッドがサブクラスで定義されることを意味します。


クラスをインスタンス化できないようにする必要があるのはなぜですか?何か正当な理由がありますか?
karlihnos

2

はい、抽象メソッドなしで抽象クラスを定義できます。ただし、内部にメソッドがない場合は、インターフェイスを使用することをお勧めします


4
最小30文字の制限を使用するための素晴らしいアイデア。
Marc W

1
抽象メソッドがない場合、どのようにインターフェイスを使用できますか?インターフェースには、デフォルトですべてのメソッド抽象があります。
ウスマンラナ2017年

1

はい、それができます。

クラス抽象を宣言することは、クラスが他のクラスによってインスタンス化されないことを意味します。

その中に少なくとも1つの抽象メソッドがあり、そのクラスの抽象メソッドを宣言することができます。

例:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

これは確実に機能します。


1

はい、できます。時々、あなたはこれをする目的が何であるかというこの質問をされるかもしれませんか?答えは、クラスが独自にインスタンス化するのを制限する必要がある場合です。その場合、ユーザーに抽象クラスを拡張して子クラスをインスタンス化してもらいます


1

できます。私の心の中での質問は、あなたがもっとすべきです。当初から、難しい答えはありません。あなたの現在の状況に正しいことをしてください。

私にとって、継承とは「is-a」関係を意味します。さらに専門的なサブタイプ(アルザス、プードルなど)によって拡張できる犬のクラスを想像してみてください。この場合、サブタイプは犬なので、犬クラスを抽象化することは正しいことかもしれません。犬が首輪を必要としているとしましょう。この場合、継承は意味がありません。犬と首輪の間に「is-a」の関係があるのは無意味です。これは間違いなく「has-a」関係であり、襟は共同オブジェクトです。犬が飼うことができるように首輪を抽象化することは意味がありません。

抽象メソッドを持たない抽象クラスが実際に「has-a」関係を表現していることがよくあります。これらの場合、私は通常、継承を使用せずにコードをより因数分解できることに気づきます。また、抽象メソッドを持たない抽象クラスはコードの匂いであることが多く、少なくともコードレビューで問題が発生するはずです。

繰り返しますが、これは完全に主観的なものです。抽象メソッドを持たない抽象クラスが理にかなっている状況があるかもしれません、それは完全に解釈と正当化次第です。あなたが取り組んでいるもののために最善の決定をしてください。


1

抽象クラスが抽象メソッドを持っていなくても、実際には意味がありません。抽象クラスは父親のようなものです。この父親にはいくつかの特性と行動があります。子供としてあなたが父親の子供になりたいとき、父親はこの方法であるはずの子供(あなた)を私たちのMOTOと言います。私の子供ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.