Java の抽象クラスは、直接インスタンス化できないクラスです。この目的は、他のクラスが継承および拡張できる基底クラスとして機能することです。重要な機能の 1 つは、抽象クラスがコンストラクターを定義できることです。コンストラクターは特別なメソッドとして知られ、クラスのオブジェクトの作成時に呼び出されます。
抽象クラスでコンストラクターを定義する際に従うべきルール:
- 抽象クラスはコンストラクターを持つことができますが、直接インスタンス化することはできません。コンストラクターは、具体的なサブクラスが作成されるときに使用されます。
- 抽象クラスには 1 つ以上の抽象メソッドが存在する場合があります。これは、それらのメソッドがクラスによって実装されていないことを意味します。インスタンス化するには、抽象メソッドを使用して抽象クラスを拡張するサブクラスがメソッドを実装する必要があります。これは、サブクラスが具象クラスでインスタンス化できる必要がある場合、抽象クラス内で宣言された各抽象メソッドに実装が必要であることを意味します。言い換えれば、抽象クラスが開いたままにした機能は、サブクラスによって埋められる必要があります。
- サブクラスがコンストラクターを使用して抽象クラスを拡張する場合、サブクラスは super キーワードを使用してスーパークラス内のコンストラクターの 1 つを呼び出す必要があります。スーパークラスのコンストラクターがオブジェクトの状態を初期化し、重要なリソースを単位化するためです。サブクラスがスーパークラス内のいずれかのコンストラクターを呼び出さない場合、オブジェクトは適切に初期化されず、効率的または正しく機能しなくなります。
- 他のクラスと同様に、抽象クラスに複数のコンストラクターを定義することが可能です。ただし、各コンストラクターは異なるパラメーター リストを使用して定義する必要があります。これにより、サブクラスは、特定のニーズに基づいて呼び出すコンストラクターを選択できるようになります。
抽象クラスを使用して実装されるコンストラクターの種類:
コンストラクターには次の 3 種類があります。
- デフォルトのコンストラクター
- パラメータ化されたコンストラクタ
- コピーコンストラクター
1. デフォルトのコンストラクター: クラス内に他のコンストラクターが定義されていない場合、コンストラクターは Java を介して自動的に作成されます。パラメータはなく、クラス フィールドのデフォルト値を初期化する以外に何も実行しません。
アルゴリズム:
ステップ1: 「Shape」という名前の抽象クラスを定義します。
ステップ2: 2 つの整数変数 'x' と 'y' を保護済みとして宣言します。
ステップ 3: Shape クラスのデフォルト コンストラクターを作成し、「x」と「y」を 0 に設定します。
Java文字列を連結する
ステップ 4: 次にメソッド「getArea()」を作成します。これは double 値を返す抽象メソッドです。
ステップ5: 次に、Shape クラスに属する 2 つの非抽象メソッド「printPosition()」と「setPosition(int x, int y)」を作成します。
ステップ6: setPosition メソッドは、x と y の値を設定します。
ステップ7: printPosition メソッドは、x と y の値を出力します。
ステップ8: Shape クラスを拡張する Circle クラスを定義します。
ステップ9: 「radius」という名前の double 変数を Circle クラスで保護されたものとして宣言します。
ステップ 10: 半径の double 値を受け入れる Circle クラスのコンストラクターを定義します。
ステップ 11: 円の面積を計算する Circle クラスの getArea メソッドを実装します。
ステップ 12: Shape クラスを拡張する Square クラスを定義します。
ステップ 13: 「side」という名前の double 変数を Square クラスで保護されたものとして宣言します。
ステップ 14: 辺の double 値を受け入れる Square クラスのコンストラクターを定義します。
ステップ 15: 正方形の面積を計算する Square クラスの getArea メソッドを実装します。
ステップ 16: Mainクラスを定義します。
ステップ 17: Mainクラスにmain関数を定義します。
ステップ 18: CircleオブジェクトとSquareオブジェクトを作成します。
ステップ 19: Circle オブジェクトと Square オブジェクトの両方に対して setPosition メソッドを呼び出します。
ステップ 20: Circle オブジェクトと Square オブジェクトの両方に対して getArea メソッドを呼び出し、結果を出力します。
ステップ21: Circle オブジェクトと Square オブジェクトの両方に対して printPosition メソッドを呼び出し、結果を出力します。
実装:
上記の手順の実装は次のとおりです
ファイル名: デフォルトメイン.java
import java.util.*; abstract class Shape { protected int x; protected int y; // default constructor public Shape() { // initialize default values for fields x = 0; y = 0; } // abstract method to calculate area public abstract double getArea(); // other methods public void setPosition(int x,int y) { this.x=x; this.y=y; } public void printPosition() { System.out.println('The Position: ('+x + ', '+ y +')'); } } class Circle extends Shape { protected double radius; // constructor public Circle(double radius) { this.radius=radius; } // implementation of getArea() for Circle public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { protected double side; // constructor public Square(double side) { this.side = side; } // implementation of getArea() for Square public double getArea() { return side * side; } } public class DefaultMain { public static void main(String args []) { // create a Circle object Circle circle = new Circle(5); circle.setPosition(2,3); // print the area and position of the Circle object System.out.println('Area of a circle is: '+circle.getArea()); circle.printPosition(); // create a Square object Square square = new Square(4); square.setPosition(5, 7); // print the area and position of the Square object System.out.println('Area of a square is: '+square.getArea()); square.printPosition(); } }
出力:
Area of a circle is: 78.53981633974483 The Position:(2, 3) Area of a square is: 16.0 The Position:(5, 7)
2. パラメータ化されたコンストラクター: オブジェクトを作成するとき、この種のコンストラクターを使用すると、オブジェクトに引数を渡すことができます。オブジェクトを値で初期化したい場合に便利です。パラメータ化されたコンストラクタは 1 つまたは追加のパラメータで定義され、オブジェクトの作成中にコンストラクタに渡された値を使用して項目の対応するフィールドが初期化されます。
アルゴリズム:
ステップ1: 抽象クラス Shape を定義します。
ステップ2: x および y という名前の int 型の 2 つの保護されたインスタンス変数を追加します。
ステップ 3: インスタンス変数 x と y を初期化し、int 型の 2 つのパラメーター x と y を受け入れるパラメーター化されたコンストラクターを作成します。
ステップ 4: 抽象クラス Shape を定義します。
Javaで乱数を生成する
ステップ5: x および y という名前の int 型の 2 つの保護されたインスタンス変数を追加します。
ステップ6: インスタンス変数 x と y を初期化し、int 型の 2 つのパラメーター x と y を受け入れるパラメーター化されたコンストラクターを作成します。
ステップ7: Shape を拡張するクラス Circle を定義します。
ステップ8: radius という名前の double 型の保護されたインスタンス変数を追加します。
トジソン・ジャワ
ステップ9: int x、y、double radius 型の 3 つのパラメーターを受け取り、super() キーワードを使用して x、y、および radius インスタンス変数を初期化するパラメーター化されたコンストラクターを定義します。
ステップ 10: Circle の面積を計算する抽象メソッド getArea() を実装します。
ステップ 11: Shape を拡張する Square クラスを定義します。
ステップ 12: double 名前付きサイド型の保護されたインスタンス変数を追加します。
ステップ 13: int x、y、double side 型の 3 つのパラメーターを受け取り、super() キーワードを使用して x、y、およびside インスタンス変数を初期化するパラメーター化されたコンストラクターを定義します。
ステップ 14: Square の面積を計算する抽象メソッド getArea() を実装します。
ステップ 15: Mainクラスを定義します。
ステップ 16: プログラムのエントリ ポイントである main() という名前の静的メソッドを定義します。
ステップ 17: パラメーター化されたコンストラクターを使用して Circle オブジェクトを作成します。
ステップ 18: getArea() メソッドと printPosition() メソッドをそれぞれ使用して、Circle オブジェクトの領域と位置を出力します。
ステップ 19: パラメーター化されたコンストラクターを使用して Square オブジェクトを作成します。
ステップ 20: getArea() メソッドと printPosition() メソッドをそれぞれ使用して、Square オブジェクトの面積と位置を出力します。
ステップ21: プログラムの終了。
実装:
以下に示す上記の手順の実装
ファイル名: パラメータ化されたMain.java
import java.util.*; abstract class Shape { protected int x; protected int y; // parameterized constructor public Shape(int x,int y) { this.x=x; this.y=y; } // abstract method to calculate area public abstract double getArea(); // other methods public void setPosition(int x,int y) { this.x=x; this.y=y; } public void printPosition() { System.out.println('The position: ('+ x+', ' +y+')'); } } class Circle extends Shape { protected double radius; // parameterized constructor public Circle(int x,int y,double radius) { super(x,y); this.radius=radius; } // implementation of getArea() for Circle public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { protected double side; // parameterized constructor public Square(int x,int y,double side) { super(x, y); this.side = side; } // implementation of getArea() for Square public double getArea() { return side * side; } } public class ParameterizedMain { public static void main(String args []) { // create a Circle object with parameterized constructor Circle circle = new Circle(2, 3, 5); // print the area and position of the Circle object System.out.println('Area of circle is: '+circle.getArea()); circle.printPosition(); // create a Square object with parameterized constructor Square square = new Square(5, 7, 4); // print the area and position of the Square object System.out.println('Area of square is:' +square.getArea()); square.printPosition(); } }
出力:
配列の長さJava
Area of circle is: 78.53981633974483 The position: (2, 3) Area of square is:16.0 The position: (5, 7)
3. コンストラクターをコピーします。 コピー コンストラクターは、既存のオブジェクトと同じ値を持つ新しいオブジェクトを作成するために使用されます (つまり、項目は以前に作成されます)。これは、既に存在するオブジェクトのレプリカである可能性のある新しいオブジェクトを作成する必要がある場合に役立ちます。コピー コンストラクターは、同一クラスの項目である引数またはパラメーターを 1 つだけ使用して定義されます。次に、コンストラクターはパラメーター オブジェクトと同じ値を持つ新しいオブジェクトを作成します。
アルゴリズム:
ステップ1: インスタンス変数とデフォルトのコンストラクターを使用して抽象クラスを宣言します。
ステップ2: 同一のクラス型のパラメーターを使用してコピー コンストラクターを定義します。
ステップ 3: コピー コンストラクターで、super キーワードを使用してスーパークラスのコピー コンストラクターを呼び出し、パラメーター オブジェクトから新しいオブジェクトにインスタンス変数をコピーします。
ステップ 4: サブクラス内の追加のインスタンス変数の値を新しい項目に割り当てます。
ステップ5: 面積を計算する抽象メソッドを実装します。
ステップ6: 必要に応じて他のメソッドを定義します。
ステップ7: main関数内でクラスのオブジェクトを作成します。
ステップ8: 必要に応じて、位置およびその他のインスタンス変数を設定します。
ステップ9: コピー コンストラクターを使用して新しいオブジェクトを作成し、元の項目をパラメーターとして渡します。
ステップ 10: 元のオブジェクトとコピーされたオブジェクトの両方の領域と位置を印刷します。
実装:
上記の手順の実装を以下に示します。
ファイル名: コピーメイン.java
import java.util.*; abstract class Shape { protected int x; protected int y; // copy constructor public Shape(Shape other) { this.x=other.x; this.y=other.y; } // default constructor public Shape() { // initialize default values for fields x=0; y=0; } // abstract method to calculate area public abstract double getArea(); // other methods public void setPosition(int x,int y) { this.x =x; this.y =y; } public void printPosition() { System.out.println('Position: (' +x+ ', ' +y+ ')'); } } class Circle extends Shape { protected double radius; // copy constructor public Circle(Circle other) { super(other); this.radius =other.radius; } // constructor public Circle(double radius) { this.radius =radius; } // implementation of getArea() for Circle public double getArea() { return Math.PI * radius * radius; } } class Square extends Shape { protected double side; // copy constructor public Square(Square other) { super(other); this.side =other.side; } // constructor public Square(double side) { this.side=side; } // implementation of getArea() for Square public double getArea() { return side * side; } } public class CopyMain { public static void main(String[] args) { // create a Circle object Circle circle1 = new Circle(5); circle1.setPosition(2,3); // create a copy of the Circle object using the copy constructor Circle circle2 = new Circle(circle1); // print the area and position of the original and copied Circle objects System.out.println('Original Area of circle: ' +circle1.getArea()); circle1.printPosition(); System.out.println('Copied Area of circle: '+circle2.getArea()); circle2.printPosition(); // create a Square object Square square1 =new Square(4); square1.setPosition(5,7); // create a copy of the Square object using the copy constructor Square square2 = new Square(square1); // print the area and position of the original and copied Square objects System.out.println('Original Area of square: '+square1.getArea()); square1.printPosition(); System.out.println('Copied Area of square: '+square2.getArea()); square2.printPosition(); } }
出力:
Original Area of circle: 78.53981633974483 Position: (2, 3) Copied Area of circle: 78.53981633974483 Position: (2, 3) Original Area of square: 16.0 Position: (5, 7) Copied Area of square: 16.0 Position: (5, 7)