java constructor class
このチュートリアルでは、Javaコンストラクター、そのタイプ、およびコンストラクターのオーバーロードやコンストラクターのチェーンなどの概念について、コード例を使用して説明します。
以前のチュートリアルから、クラスのインスタンスがオブジェクトと呼ばれることがわかります。クラスのオブジェクトは、「new」キーワードを使用して作成されます。新しいキーワードでオブジェクトを作成するとき、またはオブジェクトがインスタンス化されるときに、「コンストラクタ」と呼ばれる特別なメソッドが呼び出されます。
コンストラクターは、クラスオブジェクトを初期化するためのコードブロックとして定義されます。メソッドと同じですが、メソッドではありません。ただし、Javaでは「特別なメソッド」と呼ぶことができます。
=> ここでJavaトレーニングチュートリアルのA〜Zを確認するには、ここをクリックしてください。
学習内容:
Javaコンストラクタ
Javaコンストラクターは、作成されたばかりのオブジェクトを初期化するために使用されます。オブジェクトは、プログラムで使用される前に、いくつかのデータを持っている必要があります。したがって、コンストラクターを使用して、オブジェクトに初期データを割り当てることができます。
簡単な例として、オブジェクトを作成する必要があるクラスABCについて考えてみます。新しいキーワードを使用して、クラスABCのオブジェクト「myObj」を作成しましょう。
ABC myObj = new ABC ();
上記のステートメントは、オブジェクトmyObjを作成します。このオブジェクトが作成されると、引数のないクラスABCのコンストラクターが呼び出されます(ABC()は、コンストラクターの引数がないことを示します)。上記のコンストラクターには引数が指定されていないため、myObjのメンバーフィールドはデフォルトの初期値に初期化されます。
例えば、
- intなどの数値データ型は0に設定されます。
- Charデータ型の変数値がnull( ‘ 0’)文字に設定されています。
- 参照はnullに設定されます。
このチュートリアルでは、Javaで使用されるさまざまなコンストラクターとともに、コンストラクターについて詳しく説明します。
Javaでコンストラクターを作成する方法
Javaでコンストラクターを作成するには、以下に示す特定のルールに従う必要があります。
- クラスコンストラクターの名前は、クラスの名前と同じです。
- 最終的、抽象的、同期的、または静的なコンストラクターは存在できません。これは、Finalが定数として機能するため、抽象をインスタンス化できないためです。マルチスレッドの場合は、synchronizedが使用され、staticキーワードはクラスレベルで使用されます。
- コンストラクターでアクセス修飾子を使用できます。
- コンストラクターは戻り値の型を持つことはできません。
例えば、クラスStudentを次のように定義しましょう。
class Student{ String name; int roll_no; }
newキーワードを使用して、上記のクラスのオブジェクトを作成できます。オブジェクトの作成中に、コンストラクターを提供することで、このクラスの2つのメンバーの変数を初期化できます。コンストラクターを提供せず、以下のステートメントを実行するだけでも、
学生学生=新入生();
それでも、Javaは、2メンバー変数をシステムデフォルトに初期化するデフォルトコンストラクターを実行します。ここで、Student.nameの初期値を「Keith」、roll_noを27にする場合は、次のコンストラクターメソッドを作成できます。
Student () { name = 'Keith'; roll_no = 27; }
以下のステートメントで学生クラスのオブジェクトを作成する場合
Student student = new Student ();
その場合、メンバー変数nameとroll_noの初期値は、それぞれキースと27になります。
コンストラクターが作成されたので、いつ呼び出されますか?
上記のように、newキーワードでオブジェクトを作成するたびにコンストラクタが呼び出されます。すでに述べたように、コンストラクターが提供されていない場合、Javaは、オブジェクトがnewキーワードを使用して作成されたときに呼び出されるデフォルトのコンストラクターを提供します。
コンストラクターの例
次のプログラムは、引数のない単純なコンストラクターがあるコンストラクターの例を示しています。このコンストラクターは、メンバー変数に初期値を割り当てるだけです。
//class definition class classDemo{ int num1; int num2; //constructor classDemo(){ num1 = 100; num2 = 250; System.out.println('Inside ClassDemo::Constructor'); } public void display(){ System.out.println('num1 = '+ num1); System.out.println('num2 = '+ num2); } } class Main{ public static void main(String args()){ classDemo cd1 = new classDemo(); //create object of ClassDemo cd1.display(); } }
出力:
Javaのデフォルトコンストラクタ
デフォルトのコンストラクターは、空のコンストラクターとも呼ばれます 。このコンストラクターは、Javaコンパイラーによって、プログラマーによって実装されたコンストラクターがないクラスコードに挿入されます。デフォルトのコンストラクタはコンパイル中に挿入されるため、「。class」ファイルにのみ表示され、ソースコードには表示されません。
次のJavaクラスについて考えてみます。
ソースファイル(.java) クラスファイル(.class)
上の図の最初の図は、コンストラクターを指定していないソースコードを示しています。したがって、このコードをコンパイルして.classファイルを生成すると、隣接する図(青色)に示すように、Javaコンパイラーがデフォルトのコンストラクターを挿入したことがわかります。
注意:
Javaで引数なしのコンストラクターを記述するために、デフォルトのコンストラクターが使用されることがあります。しかし、これら2つの用語は実際には異なります。 No-argコンストラクターは、プログラマーによって指定されるJavaのコンストラクターの一種です。デフォルトのコンストラクターは、Javaコンパイラーによって挿入されるコンストラクターです。
さまざまなブラウザでWebサイトをテストします
したがって、これら2つの用語はほとんどのプログラマーによって同じ意味で使用されますが、これら2つの用語を混同しないことをお勧めします。
Javaがデフォルトのコンストラクターを挿入するときに、プログラムに変数がある場合、それらにはデフォルト値が割り当てられます。
次の表に、各データ型のデフォルト値を示します。
タイプ | デフォルト値 |
---|---|
char | u0000 |
オブジェクト | 参照null |
ブール値 | false |
バイト | 0 |
ショート | 0 |
int | 0 |
長いです | 0L |
浮く | 0.0f |
ダブル | 0.0d |
次のプログラムは、Javaのデフォルトコンストラクターの例を示しています。
class Main { int num; boolean flag; public static void main(String() args) { // A default constructor is called Main obj = new Main(); System.out.println('num:default value = ' + obj.num); System.out.println('flag:default value = ' + obj.flag); } }
出力:
Javaのコンストラクタの種類
Javaには、以下に示す2種類のコンストラクタがあります。
#1)引数なしコンストラクタ
引数のないコンストラクターは、引数なしまたは引数なしのコンストラクターと呼ばれます。引数のないコンストラクターがない場合、Javaコンパイラーはクラスのデフォルトコンストラクターを作成しません。
一般に、クラスでコンストラクターを定義する場合、デフォルトのコンストラクターはJavaコンパイラーによって挿入されません。
以下に、引数なしコンストラクターの例を示します。
import java.io.*; class DemoClass { int num; String name; // no-args Constructor called when object is created DemoClass() { System.out.println('DemoClass::Constructor called'); System.out.println('Initial member variable values:'); System.out.println('num = ' + num + ' name = ' + name); } } class Main{ public static void main (String() args) { // this will invoke no-args Constructor DemoClass dc1 = new DemoClass(); } }
出力:
このプログラムでは、引数なしのコンストラクターを提供しています。ここでは、メンバー変数を含むいくつかのメッセージを出力します。出力では、コンストラクターからのメッセージが表示され、引数なしのコンストラクターが実行されていることがわかります。
#2)パラメーター化されたコンストラクター
パラメーター化されたコンストラクターには、1つ以上のパラメーターがあります。クラスのメンバー変数に初期値を渡す必要がある場合は、パラメーター化されたコンストラクターを使用できます。
import java.io.*; class DemoClass { // data members of the class. String name; int id; // parameterized constructor called when object is created DemoClass(String name, int id) { this.name = name; this.id = id; } } class Main { public static void main (String() args) { // this will invoke the parameterized constructor. DemoClass dc1 = new DemoClass('Java', 1); System.out.println('Tutorial Name :' + dc1.name + ', Id :' + dc1.id); } }
出力:
ここでは、nameとidの2つの引数を取るパラメーター化されたコンストラクターを提供しました。
コンストラクター本体内で、引数はメンバー変数nameとidにそれぞれ値として割り当てられます。
次に、mainメソッドで、newキーワードを使用して新しいオブジェクトを作成するときに、newキーワードに続く2つの値をクラス名に渡します。これは、パラメーター化されたコンストラクターを呼び出していることを示しています。メンバー変数を表示すると、オブジェクトの作成時に渡した値が含まれていることがわかります。
Javaでオーバーロードされたコンストラクタ
ここで、クラスが複数のコンストラクターを持つことができるのか、それともクラスが1つのコンストラクターしか持つことができないのかという疑問が生じます。
1つのクラスに複数のコンストラクターを含めることができます。クラスは、適切にオーバーロードされている限り、その中にコンストラクターをいくつでも含めることができます。
では、コンストラクターのオーバーロードとは正確にはどういう意味ですか?
コンストラクターのオーバーロードは、クラスが同じ数のコンストラクターを持つことを可能にするメカニズムであり、パラメーターのタイプまたはパラメーターの順序に応じて、これらすべてのコンストラクターが異なるパラメーターリストを持つようにします。
以下のプログラムは、コンストラクターのオーバーロードを示しています。
//class with multiple constructors class DemoClass{ int val1; int val2; //no args Constructor DemoClass(){ val1 = 10; val2 = 20; System.out.println('DemoClass:: No argument Constructor'); } //Overloaded Constructor DemoClass(int num1){ val1 = num1; val2 = num1; System.out.println('DemoClass:: Overloaded Constructor with one argument'); } //Overloaded DemoClass(int num1,int num2){ val1 = num1; val2 = num2; System.out.println('DemoClass:: Overloaded Constructor with two arguments'); } public void display(){ System.out.println('val1 === '+val1 + ' ; val2 === '+val2 ); } } class Main{ public static void main(String args()){ DemoClass d1 = new DemoClass(); //object with no-args Constructor d1.display(); DemoClass d2 = new DemoClass(10); //object with 1 arg Constructor d2.display(); DemoClass d3 = new DemoClass(20,40); //object with 2 arg Constructor d3.display(); } }
出力:
上記のプログラムには、3つのコンストラクターを含むクラスがあります。最初のコンストラクターは引数なしのコンストラクターであり、次に、それぞれ1つの引数と2つの引数を持つコンストラクターがあります。コンストラクターには固有のパラメーターリストがあるため、コンストラクターはオーバーロードされていると言えます。
Javaの「this()」コンストラクタ
複数のコンストラクターを含むクラスで、このクラスの別のコンストラクターから1つのコンストラクターを呼び出したい場合はどうなりますか?
この目的のために、別のコンストラクターを呼び出すコンストラクター内でキーワード「this」を使用します。
したがって、クラスに複数のコンストラクター、引数なしのコンストラクター、およびパラメーター化されたコンストラクターがある場合、「this」キーワードを使用して、引数なしのコンストラクターからパラメーター化されたコンストラクターを呼び出します。これは、 「コンストラクターの明示的な呼び出し」。
なぜこのキーワードが必要なのですか?
コンストラクター名だけを使用してコンストラクターを直接呼び出すことはできないため、これが必要です。
注意点:
- キーワード「this」は、呼び出し元のコンストラクターの最初のステートメントである必要があります。
- コンストラクターに「this」キーワードがある場合、「super」を持つことはできません。これは、コンストラクターがsuperまたはthisのいずれかを持つことができることを意味します。
class TestClass { TestClass() { //calling Parameterized Constructor this('SoftwareTestingHelp'); System.out.println('TestClass::No-args Constructor'); } TestClass(String str) { System.out.println('TestClass:: Parameterized Constructor(String):' + str); } } class Main{ public static void main(String() args) { TestClass obj = new TestClass(); } }
出力:
上記のプログラムには、2つのコンストラクターを持つ「TestClass」があります。これを引数なしのコンストラクターから呼び出します(「SoftwareTestingHelp」)。これは、パラメーター化されたコンストラクターの明示的な呼び出しです。
Javaでコンストラクタをコピーする
C ++のコピーコンストラクターを認識しています。コピーコンストラクターは、引数としてオブジェクト参照を持つコンストラクターであり、参照オブジェクトのデータを使用して新しいオブジェクトが作成されます。
C ++は、プログラムで提供されていない場合、デフォルトのコピーコンストラクターを提供します。
Javaはコピーコンストラクターのサポートも提供しますが、デフォルトのコピーコンストラクターは提供しません。
次のJavaプログラムは、実数と虚数のコンポーネントを持つ複素数の古典的な例を使用して、コピーコンストラクターを示しています。
class Complex { private double real, imaginary; // parametrized constructor public Complex(double real, double imaginary) { System.out.println('Complex:: parametrized constructor'); this.real = real; this.imaginary = imaginary; } // copy constructor Complex(Complex c) { System.out.println('Complex::Copy constructor called'); real = c.real; imaginary = c.imaginary; } // Overriding the toString of Object class @Override public String toString() { return '(' + real + ' + ' + imaginary + 'i)'; } } public class Main { public static void main(String() args) { Complex c1 = new Complex(1, 5); //calls parametrized constructor System.out.println('C1 = ' + c1); // copy constructor called Complex c2 = new Complex(c1); System.out.println('C2 = ' + c2); // this is a simple assignment operator Complex c3 = c2; } }
出力:
上記のプログラムには、パラメーター化されたコンストラクターとコピーコンストラクターを持つ「Complex」クラスがあります。最初のmainメソッドでは、パラメーター化されたコンストラクターを使用してオブジェクトc1を作成します。次に、以下のステートメントを使用して、
Complex c2 = new Complex (c1);
上記のステートメントは、新しいオブジェクトc2の作成中に参照c1がコンストラクターに渡されるときに、コピーコンストラクターを呼び出します。
Javaでのコンストラクタチェーン
コンストラクターチェーンは、あるコンストラクターが同じクラスの別のコンストラクターを呼び出すプロセスです。
基本クラスから継承した場合でも、子クラスオブジェクトが作成されると、基本クラスのコンストラクターが最初に呼び出されます。これはコンストラクターチェーンの例でもあります。
Javaでは、コンストラクターチェーンは2つのアプローチを使用して実現できます。
- 同じクラス内 :同じクラスの別のコンストラクターから1つのコンストラクターを呼び出す場合、this()キーワードを使用して使用できます。
- 基本クラスから: 基本クラスのコンストラクターは、superキーワードを使用して、派生クラスのコンストラクターから呼び出すことができます。
コンストラクターチェーンが必要なのはなぜですか?
コンストラクターで複数のタスクを実行する場合は、1つのコンストラクターで各タスクを実行する代わりに、タスクを複数のコンストラクターに分割し、コンストラクターを相互に呼び出してコンストラクターチェーンを作成します。
以下に、コンストラクターチェーンを実行する際に従う必要のあるルールの一部を示します。
- コンストラクターの連鎖は任意の順序で実行され、同じ結果が生成されます。
- 式「this」キーワードは、コンストラクターの最初の式である必要があります。
- このキーワードのないコンストラクターが少なくとも1つ必要です。
プログラムに継承がある場合は、コンストラクターチェーンを実行することもできます。この場合、サブクラスは基本クラスのコンストラクターを呼び出します。これを行うことにより、サブクラスオブジェクトの作成は、スーパークラスメンバーの初期化から始まります。
次に、上記のアプローチを使用して、Javaでコンストラクターチェーンを実装します。
#1)同じクラス内のコンストラクターチェーン
class DemoClass { // No args constructor DemoClass() { System.out.println('DemoClass::No args constructor'); } // parameterized constructor DemoClass(int val1) { // calls default constructor this(); System.out.println('DemoClass::Constructor with 1 argument: ' + val1); } // parameterized constructor DemoClass(int val1, int val2) { // invokes parameterized constructor with 1 argument this(5); System.out.print('DemoClass::constructor with 2 arguments:'); System.out.println('Product of 2 arguments = ' + val1 * val2); } } class Main{ public static void main(String args()) { // call parameterized constructor with 2 arguments new DemoClass(10, 15); } }
出力:
すでに述べたように、「this」キーワードを使用して、同じクラス内でコンストラクターチェーンを実現します。上記のプログラムでは、3つのコンストラクターがあり、「this」キーワードを使用して別のコンストラクターから1つのコンストラクターを呼び出します。
基本クラスから
クラスが別のクラスを継承する場合、コンストラクターチェーンである派生クラスのオブジェクトを作成するときに、親クラスのコンストラクターが最初に呼び出されます。
派生クラスの基本クラスコンストラクターを明示的に呼び出したい場合は、この目的でキーワード「super」を使用する必要があります。 「super」キーワードを使用すると、最上位のクラスに到達するまで、継承階層内のスーパークラスコンストラクターを呼び出すことができます。
以下のプログラムは、コンストラクターチェーンに「super」キーワードを使用する方法を示しています。
EclipseでJavaプロジェクトを作成する方法
class BaseClass { String name; // no args constructor BaseClass() { this(''); System.out.println('BaseClass::No-argument constructor'); } // Parameterized constructor BaseClass(String name) { this.name = name; System.out.println('BaseClass::Parameterized constructor'); } } class DerivedClass extends BaseClass { // No-argument constructor DerivedClass() { System.out.println('DerivedClass::No-argument constructor'); } // parameterized constructor DerivedClass(String name) { super(name); // invokes Parameterized constructor of BaseClass System.out.println('DerivedClass::Parameterized constructor'); } } class Main { public static void main(String args()) { // invokes DerivedClass parameterized constructor DerivedClass obj = new DerivedClass('Java'); } }
出力:
上記のプログラムでは、値「Java」を使用して派生クラスのパラメーター化されたコンストラクターを呼び出します。このコンストラクターは、「super(name);」を使用して基本クラスコンストラクターを呼び出します。これは、基本クラスのパラメーター化されたコンストラクターを実行します。
よくある質問
Q#1)Javaでコンストラクターを作成するにはどうすればよいですか?
回答: クラスの名前と同じ名前を持つ特別なメソッドとしてコンストラクターを作成します。コンストラクターも戻り値の型を持つことはできません。アクセス修飾子を持つことはできますが、最終、静的、抽象、または同期することはできません。
ABCがクラスの場合、そのコンストラクターを次のように定義できます。
ABC(){} //no args constructor OR ABC(param1, param 2, …, param n) {} //parameterized constructor
Q#2)Javaのコンストラクターの利点は何ですか?
回答: コンストラクターを使用すると、オブジェクトが作成された瞬間に最初にクラスのメンバーを初期化できます。コンストラクターにより、通常のメソッドを暗黙的に呼び出す必要がなくなります。
コンストラクターはオブジェクト作成フェーズで呼び出されるため、コンストラクターで初期化や開始タスクなどに関連するさまざまなタスクを実行できます。
Q#3)コンストラクターが使用されるのはなぜですか?
回答: コンストラクターは主にクラスのメンバーを初期化するために使用され、クラスのオブジェクトが作成されるときに呼び出されます。
Q#4)コンストラクターをプライベートにすることはできますか?
回答: はい、プライベートコンストラクターを持つことができます。コンストラクターがプライベートの場合、クラスがインスタンス化されないようにすることができます。
Q#5)コンストラクターを最終版にすることはできますか?
回答: いいえ、最終的なコンストラクターを持つことはできません。
結論
このチュートリアルでは、Javaのコンストラクターについての説明を開始しました。コンストラクターの基本、その作成、および従うべきルールを学びました。また、Javaのコピーコンストラクタについても説明しました。
デフォルトのコンストラクターとコンストラクターのタイプ、およびコンストラクターのオーバーロードやコンストラクターのチェーンなどの概念について、例を挙げて説明しました。これらのトピックの一部として、コンストラクターでの「this」キーワードの使用も確認しました。
=> EasyJavaトレーニングシリーズをお読みください。