web-dev-qa-db-ja.com

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

抽象メソッドを追加せずに抽象クラスを定義できますか?

101
VisaMasterCard

もちろん。

クラスアブストラクトを宣言することは、それが単独でインスタンス化されることを許可しないことを意味します。

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

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

148
biziclop

はい、できます。なぜそれをやってみませんか?

15
Marc W

はい、できます。 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);
    }
}

これは大丈夫です。

8
Shreyos Adikari

はい抽象メソッドなしで抽象クラスを作成できます。抽象メソッドなしの抽象クラスの最良の例はHttpServletです。
[。クラス内のメソッド。

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

5
JegsVala

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

4

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

ので、2つのケース

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

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

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

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

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

3
Manoj Kalluri

はい、抽象メソッドを持たない抽象クラスを作成できます。両方とも独立した概念です。クラス抽象を宣言すると、それ自体ではインスタンス化できず、サブクラス化のみが可能になります。メソッド抽象を宣言すると、サブクラスでメソッドが定義されます。

3
Vivek Vermani

はい、できます。

クラス抽象を宣言すると、クラスは他のクラスによってインスタンス化されません。

そして、その中に少なくとも1つの抽象メソッドが存在する必要があり、その意味は、そのクラスで抽象メソッドを宣言できます。

例:

public abstract class abs {

    protected int cx = 0, cy = 0;

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

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

2
Kishan

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

私にとって、継承とは「is-a」関係を意味します。犬のクラスを想像してください。これは、より専門的なサブタイプ(アルザス、プードルなど)によって拡張できます。この場合、サブクラスは犬であるため、犬クラスを抽象化することは正しいことです。さて、犬には首輪が必要だと想像しましょう。この場合、継承は意味がありません。犬と首輪の間に「is-a」関係があるのはナンセンスです。これは間違いなく「has-a」関係であり、カラーはコラボレーションオブジェクトです。首輪を抽象化して犬が持つことができるようにするのは意味がありません。

私はしばしば、抽象メソッドを持たない抽象クラスが実際に「has-a」関係を表現していることに気付きます。これらの場合、私は通常、継承を使用せずにコードをよりよくファクタリングできることを発見しました。また、抽象メソッドを持たない抽象クラスは、多くの場合コードの匂いであり、少なくともコードレビューで提起される質問につながるはずです。

繰り返しますが、これは完全に主観的です。抽象メソッドを持たない抽象クラスが理にかなっている場合がありますが、それは完全に解釈と正当化にかかっています。あなたが取り組んでいるものに最適な決定を下します。

1
Jeremy

はい、できます。時々、これを行う目的は何かという質問をされることがありますか?答えは次のとおりです。クラスが独自にインスタンス化するのを制限する必要がある場合があります。その場合、ユーザーにAbstractクラスを拡張し、子クラスをインスタンス化してほしい

1