質問

抽象クラスにコンストラクターを含めることはできますか?

もしそうなら、それはどのように使用でき、どのような目的で使用できますか?

役に立ちましたか?

解決

はい、抽象クラスはコンストラクタを持つことができます。これを考慮してください:

abstract class Product { 
    int multiplyBy;
    public Product( int multiplyBy ) {
        this.multiplyBy = multiplyBy;
    }

    public int mutiply(int val) {
       return multiplyBy * val;
    }
}

class TimesTwo extends Product {
    public TimesTwo() {
        super(2);
    }
}

class TimesWhat extends Product {
    public TimesWhat(int what) {
        super(what);
    }
}

スーパークラス Product は抽象クラスであり、コンストラクターがあります。具象クラス TimesTwo には、値2をハードコーディングするだけのコンストラクタがあります。具象クラス TimesWhat には、呼び出し元が値を指定できるコンストラクタがあります。

抽象コンストラクターは、クラスのセットアップに必要な最小フィールドなど、クラスの制約または不変条件を適用するために頻繁に使用されます。

  

注:親にはデフォルト(または引数なし)コンストラクターがないため   抽象クラス、サブクラスで使用されるコンストラクターは明示的に呼び出す必要があります   親コンストラクタ。

他のヒント

次のいずれかの状況にある場合、抽象クラスでコンストラクターを定義します。

  • いくつかを実行したい 初期化(のフィールドへ 抽象クラス)の前に サブクラスの実際のインスタンス化 行われます
  • で最終フィールドを定義しました 抽象クラスが、あなたはしませんでした 宣言でそれらを初期化する 自体;この場合、あなたは持っている必要があります これらを初期化するコンストラクタ フィールド

注意:

  • 複数を定義できます コンストラクター(異なる 引数)
  • すべてを定義する必要があります コンストラクターの保護(それらを作成する とにかく公開は無意味です)
  • サブクラスコンストラクターは アブストラクトの1つのコンストラクターを呼び出します クラス; 呼び出す必要がある場合もあります (引数なしのコンストラクタがない場合 抽象クラスで)

いずれにしても、コンストラクターを定義しない場合、コンパイラーが自動的にコンストラクターを生成することを忘れないでください(これはパブリックであり、引数がなく、何もしません)。

はい、コンストラクターを持つことができ、定義され、他のクラスのコンストラクターと同じように動作します。抽象クラスを直接インスタンス化することはできず、拡張するだけであるため、サブクラスのコンストラクターから常に使用されます。

はい抽象クラスにはコンストラクタを含めることができます

はい、クラスを抽象クラスとして定義する場合、インスタンス化することはできませんが、抽象クラスにコンストラクターを持たせることはできません。各抽象クラスには、その抽象クラスの抽象メソッドを実装する具象サブクラスが必要です。

サブクラスのオブジェクトを作成すると、対応する継承ツリー内のすべてのコンストラクターが上から下へのアプローチで呼び出されます。同じケースが抽象クラスにも適用されます。抽象クラスのオブジェクトを作成することはできませんが、具象クラスおよび抽象クラスのサブクラスであるクラスのオブジェクトを作成すると、抽象クラスのコンストラクターが自動的に呼び出されます。したがって、抽象クラスにコンストラクターを含めることができます。

注:非抽象クラスには抽象メソッドを含めることはできませんが、抽象クラスには非抽象メソッドを含めることができます。理由はコンストラクタのそれと似ています。違いは、自動的に呼び出される代わりにsuper()を呼び出すことができる点です。また、まったく意味をなさないため、抽象コンストラクターのようなものはありません。

それができるだけでなく、常に行います。指定しない場合、他のクラスと同様に、デフォルトの引数なしコンストラクタがあります。実際、ネストされたクラスと匿名クラスを含むすべてのクラスは、指定されていない場合はデフォルトのコンストラクターを取得します(匿名クラスの場合、クラスを指定することは不可能なので、常にデフォルトのコンストラクターを取得します)。

コンストラクタを持つ抽象クラスの良い例は、カレンダークラス。 Calendar.getInstance()を呼び出してCalendarオブジェクトを取得しますが、保護されたコンストラクタも持っています。コンストラクターが保護されている理由は、そのサブクラスのみがそれらを呼び出すことができるようにするためです(または、同じパッケージ内のクラスですが、抽象なので、適用されません)。 GregorianCalendar はCalendarを拡張するクラスの例。

はい、できます。一般に、抽象クラスコンストラクターは、すべてのサブクラスに共通の初期化イベントのスーパーコールに使用されます

抽象クラスはコンストラクタを持つことができますが、抽象クラスのオブジェクトを作成することはできませんので、そのコンストラクタをどのように使用しますか?

サブクラスでその抽象クラスを継承すると、サブクラスのsuper(value)メソッドを介してその(abstract's)コンストラクターに値を渡すことができ、コンストラクターを継承しません。

スーパーを使用すると、抽象クラスのコンストラクターに値を渡すことができ、私が覚えている限り、メソッドまたはコンストラクターの最初のステートメントでなければなりません。

多くの良い答えがありますが、2セントを差し上げたいと思います。

コンストラクターオブジェクトを構築しません。オブジェクトの初期化に使用されます。

はい、Abstractクラスには常にコンストラクターがあります。独自のコンストラクターを定義しない場合、コンパイラーはAbstractクラスにデフォルトのコンストラクターを提供します。 上記は、ネスト、抽象、匿名など、すべてのクラスに当てはまります。

(インターフェイスとは異なり)抽象クラスは、初期化が必要な非最終非静的フィールドを持つことができます。それを行うために、抽象クラスに独自のコンストラクタを書くことができます。ただし、その場合、デフォルトのコンストラクタはありません。

public abstract class Abs{
    int i;
    int j;
    public Abs(int i,int j){
        this.i = i;
        this.j = j;
        System.out.println(i+" "+j);
    }
}

上記の抽象クラスを拡張する際は、各コンストラクターから明示的にsuperを呼び出す必要がありますコンストラクターの最初の行は、super()を呼び出します。 super()を明示的に呼び出さない場合、Javaがそれを行います。 以下のコードはコンパイルされません:

public class Imp extends Abs{

public Imp(int i, int j,int k, int l){
    System.out.println("2 arg");
}
}

以下の例のように使用する必要があります:

public class Imp extends Abs{

public Imp(int i, int j,int k, int l){
    super(i,j);
    System.out.println("2 arg");
}
}

もちろん、抽象クラスはコンストラクタを持つことができます。一般に、クラスコンストラクタはフィールドを初期化するために使用されます。したがって、抽象クラスコンストラクタは抽象クラスのフィールドを初期化するために使用されます。子クラスのインスタンス化が行われる前に抽象クラスの特定のフィールドを初期化する場合は、抽象クラスのコンストラクターを提供します。抽象クラスコンストラクターを使用して、すべての子クラスに関連するコードを実行することもできます。これにより、コードの重複が防止されます。

抽象クラスのインスタンスを作成することはできませんが、抽象クラスから派生したクラスのインスタンスを作成することはできます。そのため、派生クラスのインスタンスが作成されると、親抽象クラスコンストラクターが自動的に呼び出されます。

リファレンス:これ記事

これを考慮してください:

abstract class Product { 
    int value;
    public Product( int val ) {
        value= val;
    }
    abstract public int multiply();
}

class TimesTwo extends Product {
    public int mutiply() {
       return value * 2;
    }
}

スーパークラスは抽象クラスであり、コンストラクターがあります。

具象クラスでは、具象型Fnordのコンストラクターの宣言により、2つのことが効果的に公開されます。

  • Aは、コードがFnordのインスタンスの作成を要求できることを意味します

  • Aは、構築中のFnordから派生した型のインスタンス がすべてのベースクラス機能の初期化を要求できることを意味します。

おそらく、これら2つの能力を個別に制御する手段があるはずですが、具体的なタイプ1の定義ごとに両方が可能になります。最初の機能は抽象クラスにとって意味がありませんが、2番目の機能は抽象クラスにとって他の機能と同じくらい意味があるため、その宣言は必要で便利です。

はい。そして、継承クラスのインスタンスが作成されると、抽象クラスのコンストラクターが呼び出されます。たとえば、次は有効なJavaプログラムです。

// An abstract class with constructor
abstract class Base {
Base() { System.out.println("Base Constructor Called"); }
abstract void fun();
    }
class Derived extends Base {
Derived() { System.out.println("Derived Constructor Called"); }
void fun() { System.out.println("Derived fun() called"); }
    }

class Main {
public static void main(String args[]) { 
   Derived d = new Derived();
    }

}

これは上記のコードの出力です

呼び出される基本コンストラクタ 呼び出された派生コンストラクタ

参照: ここにリンクの説明を入力

javafuns こちらで説明されているように、これは例です。

public abstract class TestEngine
{
   private String engineId;
   private String engineName;

   public TestEngine(String engineId , String engineName)
   {
     this.engineId = engineId;
     this.engineName = engineName;
   }
   //public gettors and settors
   public abstract void scheduleTest();
}


public class JavaTestEngine extends TestEngine
{

   private String typeName;

   public JavaTestEngine(String engineId , String engineName , String typeName)
   {
      super(engineId , engineName);
      this.typeName = typeName;
   }

   public void scheduleTest()
   {
     //do Stuff
   }
}

はい、抽象クラスにはコンストラクタを含めることができます!

以下は、抽象クラスでコンストラクターを使用した例です。

abstract class Figure { 

    double dim1;        
    double dim2; 

    Figure(double a, double b) {         
        dim1 = a;         
        dim2 = b;         
    }

    // area is now an abstract method 

   abstract double area(); 

}


class Rectangle extends Figure { 
    Rectangle(double a, double b) { 
        super(a, b); 
    } 
    // override area for rectangle 
    double area() { 
        System.out.println("Inside Area for Rectangle."); 
        return dim1 * dim2; 
    } 
}

class Triangle extends Figure { 
    Triangle(double a, double b) { 
        super(a, b); 
    } 
    // override area for right triangle 
    double area() { 
        System.out.println("Inside Area for Triangle."); 
        return dim1 * dim2 / 2; 
    } 
}

class AbstractAreas { 
    public static void main(String args[]) { 
        // Figure f = new Figure(10, 10); // illegal now 
        Rectangle r = new Rectangle(9, 5); 
        Triangle t = new Triangle(10, 8); 
        Figure figref; // this is OK, no object is created 
        figref = r; 
        System.out.println("Area is " + figref.area()); 
        figref = t; 
        System.out.println("Area is " + figref.area()); 
    } 
}

だからあなたは答えを得たと思います。

抽象クラスはインスタンス化できませんが、コンストラクターを持つことができます。ただし、抽象クラスで定義されたコンストラクタは、この抽象クラスの具象クラスのインスタンス化に使用できます。 JLS を確認します。

  

クラスインスタンスの作成を使用して抽象クラスのインスタンスを作成しようとすると、コンパイル時エラーになります   式

     

それ自体が抽象ではない抽象クラスのサブクラスは、   インスタンス化され、その結果、   抽象クラス、したがって、フィールド初期化子の実行   そのクラスのインスタンス変数。

抽象クラスはすべてのアクセス修飾子の変数を持つことができるため、デフォルト値に初期化する必要があるため、コンストラクターが必要です。 子クラスをインスタンス化すると、抽象クラスのコンストラクターが呼び出され、変数が初期化されます。

それどころか、インターフェースには定数変数のみが含まれているため、それらはすでに初期化されています。したがって、インターフェースにはコンストラクターは必要ありません。

コンストラクタチェーンを実現するために、抽象クラスにはコンストラクタがあります。 コンパイラは、スーパークラスコンストラクターを呼び出すサブクラスコンストラクター内にSuper()ステートメントを保持します。抽象クラスのコンストラクタがなかった場合、Javaルールに違反し、コンストラクタチェーンを実現できません。

はい、抽象クラスはコンストラクタを持つことができます。抽象クラスでは、必要なだけコンストラクターをオーバーロードできます。これらの請負業者は、抽象クラスを拡張するオブジェクトの初期状態を初期化するために使用できます。オブジェクトは" new"によって作成されるため、抽象クラスのオブジェクトを作成することはできません。コンストラクタではなくキーワード...これらは、サブクラスオブジェクトの状態を初期化するためだけにあります。

はい、確かに、Abstractクラス変数の初期化で既に述べたように、追加できます。 ただし、明示的に宣言しないと、とにかく" Constructor Chaining"の暗黙的なコンストラクターがあります。働く。

クラスのコンストラクタの目的は、フィールドの初期化に使用されますが、「オブジェクトのビルド」には使用されません。抽象スーパークラスの新しいインスタンスを作成しようとすると、コンパイラーはエラーを出します。ただし、抽象クラスEmployeeを継承し、その変数を設定することでコンストラクターを使用できます。下の例を参照してください

public abstract class Employee {
  private String EmpName;
  abstract double calcSalary();

  Employee(String name) {
    this.EmpName = name;// constructor of abstract class super class
  }
}

class Manager extends Employee{
 Manager(String name) {
    super(name);// setting the name in the constructor of sub class
 }
double calcSalary() {
    return 0;
 }
}

はい。他のクラスと同じです。コンストラクタを持つことができ、基本クラスのオブジェクトを作成した後に呼び出されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top