English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、例を通じてJavaのコンストラクタについて学び、それらの作成と使用方法、そして異なる種類のコンストラクタについて説明します。
Javaでは、各クラスにそのコンストラクタがあります。クラスのオブジェクトが作成されると、自動的にそのコンストラクタが呼び出されます。コンストラクタは方法に似ていますが、実際には方法ではありません。
一つJava メソッドJavaのコンストラクタは、名前と戻り値型で区別されます。コンストラクタはクラスの名前と同名で、値を返さないです。例えば、
class Test { Test() { //構造関数の本体 } }
ここでは、Test()はコンストラクタです。クラスの名前と同じ名前を持ち、戻り値型がありません。
class Test { void Test() { // メソッドの本体 } }
ここでは、Test()はクラスの名前と同じですが、戻り値型voidを持っています。したがって、それはコンストラクタではなく、メソッドです。
class Main { private int x; // 構造関数の本体 private Main(){ System.out.println("コンストラクタが呼び出されます"); x = 5; } public static void main(String[] args){ //オブジェクトの作成時にコンストラクタを呼び出します Main obj = new Main(); System.out.println("xの値 = ") + obj.x); } }
出力:
コンストラクタが呼び出されます xの値 = 5
上記の例では、Main()という名前のプライベートなコンストラクタがあります。mainメソッドでは、objという名前のクラスオブジェクトを生成しています。
Main obj = new Main();
このプロセス中にコンストラクタが呼び出されます。したがって、print文を実行し、変数xを初期化します。
Javaでは、コンストラクタは以下のように分類されます3種類:
パラメータのないコンストラクタ
デフォルトコンストラクタ
引数コンストラクタ
Javaのコンストラクタは引数を持ち得るか持ち得ないかで分類されます。引数を受け取らないコンストラクタを無引数コンストラクタと呼びます。例えば、
private Constructor() { // 構造関数の本体 }
class Main { int i; //パラメータなしの構造関数 private Main(){ i = 5; System.out.println("Object created and i = ") + i); } public static void main(String[] args) { //引数なしでコンストラクタを呼び出します Main obj = new Main(); } }
出力:
Object created and i = 5
ここでは、Main()関数は引数を受け取らないように構築されています。
Main()コンストラクタのアクセス修飾子がプライベート(private)であることに気づきましたか?
これは、オブジェクトが同じクラスからインスタンス化されているためです。したがって、コンストラクタにアクセスできます。
しかし、オブジェクトがクラスの外部で作成された場合、コンストラクタをpublicに宣言する必要があります。例えば:
class Company { String domainName; // 公共のコンストラクタ public Company(){ domainName = "oldtoolbag.com"; } } public class Main { public static void main(String[] args) { // 別のクラスでオブジェクトを作成します Company companyObj = new Company(); System.out.println("Domain name = "+ companyObj.domainName); } }
出力:
Domain name = oldtoolbag.com
関連リード: Java アクセス修飾子
コンストラクタを作成しない場合、Javaコンパイラは実行時に無引数のコンストラクタを自動的に作成します。このコンストラクタはデフォルトのコンストラクタと呼ばれ、未初期化のすべてのインスタンス変数にデフォルトの値を初期化します。
タイプ | デフォルトの値 |
---|---|
boolean | false |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
char | \u0000 |
float | 0.0f |
double | 0.0d |
object | null |
class DefaultConstructor { int a; boolean b; public static void main(String[] args) { //デフォルトのコンストラクタを呼び出します DefaultConstructor obj = new DefaultConstructor(); System.out.println("a = " + obj.a); System.out.println("b = " + obj.b); } }
出力:
a = 0 b = false
上記のプログラムでは、変数aとbの値はまだ初期化されていません。しかし、クラスのオブジェクトを作成するときに、出力にこれらの値が何らかの値で初期化されていることが見られます。
这是因为Javaコンパイラが自動的にデフォルトのコンストラクタを作成しています。このコンストラクタはデフォルトの値0とfalseを使用して変数aとbの値を初期化します。
上面的程序等同于:
class DefaultConstructor { int a; boolean b; //私有构造函数 private DefaultConstructor() { a = 0; b = false; } public static void main(String[] args) { //调用构造函数 DefaultConstructor obj = new DefaultConstructor(); System.out.println("a = " + obj.a); System.out.println("b = " + obj.b); } }
出力:
a = 0 b = false
与方法类似,我们可以将参数传递给构造函数。此类构造函数称为参数化构造函数。例如,
private Constructor (arg1arg2..., argn) { // 構造関数の本体 }
class Vehicle { int wheels; //単一の値を受け取る構造関数 private Vehicle(int wheels){ this.wheels = wheels; System.out.println(wheels + " wheeler vehicle created."); } public static void main(String[] args) { //単一の値を渡して構造関数を呼び出す Vehicle v1 = new Vehicle(2); Vehicle v2 = new Vehicle(3); Vehicle v3 = new Vehicle(4); } }
出力:
2 wheeler vehicle created. 3 wheeler vehicle created. 4 wheeler vehicle created.
上記の例では、Vehicle()という名前の構造関数があります。この構造関数はwheelsという名前のパラメータを受け取ります。
ここでは、オブジェクトを作成する際に、パラメータを構造関数に渡しています。そして、パラメータに基づいて出力が生成されています。
メソッドのオーバーロードと同様に、Javaで構造関数をオーバーロードすることもできます。メソッドのオーバーロードに不慣れであれば、以下を参照してください。Java メソッドオーバーロード.
構造関数のオーバーロードでは、異なるパラメータを持つ2つ以上の構造関数があります。例えば、
class Company { String domainName; //パラメータなしの構造関数 public Company(){ this.domainName = "default"; } //単一のパラメータを持つ構造関数 public Company(String domainName){ this.domainName = domainName; } public void getName(){ System.out.println(this.domainName); } public static void main(String[] args) { //パラメータなしで構造関数を呼び出す Company defaultObj = new Company(); //単一のパラメータで構造関数を呼び出す Company w3codeboxObj = new Company("oldtoolbag.com"); defaultObj.getName(); w3codeboxObj.getName(); } }
出力:
default oldtoolbag.com
上記の例では、public Company()とpublic Company(String domainName)という2つの構造関数があります。
ここでは、2つの構造関数が異なる値で変数domainNameを初期化しています。したがって、必要な値に応じて、main()メソッドからコンストラクタを呼び出すことができます。
注意、このキーワードを使用してクラスの変数を指定します。this キーワードに関する詳細情報は、以下のURLを参照してください。Java this キーワード.
コンストラクタはオブジェクトのインスタンス化時に暗黙的に呼び出されます。
コンストラクタを作成する二つのルールは:
コンストラクタの名前はクラスの名前と同じであるべきです。
Java コンストラクタはリターンタイプを持たないことができます。
クラスにコンストラクタがない場合、Java コンパイラはランタイムで自動的に作成します。デフォルトコンストラクタ。デフォルトコンストラクタはインスタンス変数をデフォルト値で初期化します。例えば、int 変数は 0 に初期化されます。
コンストラクタのタイプ:
パラメータのないコンストラクタ - 何も引数を受け取らないコンストラクタ
デフォルトコンストラクタ - 明示的に定義しない場合、Java コンパイラは自動的にコンストラクタを作成します。
パラメータ化コンストラクタ - 引数を受け取るコンストラクタ
コンストラクタは抽象的 abstract、static、または final ではありません。
コンストラクタはオーバーロードできますが、オーバライズすることはできません。