私は非常に基本的な質問をしていますが、重複しているとマークされている可能性があります(ただし、答えが見つかりませんでした):
すべてのメソッドが抽象として宣言されている抽象クラスの実用的な例はありますか?
ほとんどの場合、Java チュートリアルでも説明されているように、すべてのメソッドが抽象化されたクラスはインターフェイスになります。
しかし、抽象クラスとインターフェースは2つの異なる概念であるため、「完全な抽象クラス」を持つことを説得力のある例を探しています
私は非常に基本的な質問をしていますが、重複しているとマークされている可能性があります(ただし、答えが見つかりませんでした):
すべてのメソッドが抽象として宣言されている抽象クラスの実用的な例はありますか?
ほとんどの場合、Java チュートリアルでも説明されているように、すべてのメソッドが抽象化されたクラスはインターフェイスになります。
しかし、抽象クラスとインターフェースは2つの異なる概念であるため、「完全な抽象クラス」を持つことを説得力のある例を探しています
私が考える唯一の実用的なアプローチは、Abstract class
状態を保持できることです。したがって、アクセス レベルprotected
のプロパティを内部に持つことができprotected abstract methods
、すべてをpublic
.
実際の例としては、Java の保護されたメソッドには「継承アクセス」と「パッケージ アクセス」があります。
public interface Operation{
void operate();
}
public abstract class AbstractClase implements Operation{
protected Operation delegate;
public AbstractClase(Operation delegate){
this.delegate=delegate;
}
//delegate implementation responsability to children
protected abstract doSomething();
}
抽象クラスを使用することの欠点は、他の何かを拡張する可能性も失うことです。
状態を保持するだけでなく、すべてのインターフェイス メンバーが暗黙的に であることを覚えておく価値がありますpublic
。したがって、抽象メソッドの可視性を制限すること自体が、インターフェイスの代わりに抽象クラスを使用する十分な理由になる可能性があります。
上記の2つの回答に加えて、インターフェイスは定数(パブリック、静的、および最終的な変数)のみを持つことができますが、抽象クラスにはそのような制限はありません。
抽象クラスには、子クラスがインスタンス化されるときに暗黙的に呼び出されるコンストラクターを含めることができます (パラメーター化されていない場合)。しかし、これはインターフェースでは不可能です。
抽象クラスの使用例を次に示します。
abstract class Animal{
public int noOfLegs;
public boolean isAlive;
Animal(){
isAlive = true;
}
public abstract void walk();
}
class Cow extends Animal{
Cow(){
noOfLegs = 4;
}
public void walk(){
if(isAlive){
//Code for walking
}
}
}
public abstract class animal{
public abstract void speak(){
System.out.println("animal voice");
}
}
public class dog extends animal{
public void speak(){
System.out.println("dog voice");
}
}
抽象クラスのもう 1 つの一般的な目的は、クラスのインスタンスを防止することです。たとえば、
abstract class Mammal{
int i=0;
}
public class Man extends Mammal{
public setMeValue(int i){
this.i=i;
}
public static void main(String args[]){
Mammal m= new Man();
man.setMeValue(10);
}
}
上記のコードでは、インスタンス Mammal のオブジェクトが存在しないことを効果的に確認しています。