GeeksforGeeks
前提条件–Javaのコンストラクタ
コンストラクタ連鎖は、現在のオブジェクトに関して別のコンストラクタからあるコンストラクタを呼び出すプ
コンストラクタの連鎖は二つの方法で行うことができます:
- 同じクラス内:基本クラスから同じクラス
- 内のコンストラクタにthis()キーワードを使用して行うことができます。super()キーワードを使用して基本クラスからコン
コンストラクタチェインは継承によって発生します。 サブクラスコンストラクタのタスクは、最初にスーパークラスのコンストラクタを呼び出すことです。 これにより、サブクラスのオブジェクトの作成は、スーパークラスのデータメンバーの初期化から開始されます。 継承チェーンには任意の数のクラスが存在する可能性があります。 すべてのコンストラクタは、最上部のクラスに達するまでチェーンを呼び出します。
なぜコンストラクタチェーンが必要なのですか?
このプロセスは、単一のコンストラクタで各タスクのコードを作成するのではなく、単一のコンストラクタで複数のタスクを実行したい場合に使用されます。
this()キーワードを使用した同じクラス内のコンストラクタ連鎖 :
class
Temp
{
Temp()
{
this
(
5
);
System.out.println(
"The Default constructor"
);
}
Temp(
int
x)
{
this
(
5
,
15
);
System.out.println(x);
}
Temp(
int
x,
int
y)
{
System.out.println(x * y);
}
public
static
void
main(String args)
{
new
Temp();
}
}
出力:
755The Default constructor
コンストラクターチェインのルール:
- this()式は常にコンストラクタの最初の行にする必要があります。
- this()キーワード(上記の例ではコンストラクタ3)のないコンストラクタが少なくとも一つある必要があります。
- コンストラクタチェーンは任意の順序で実現できます。
コンストラクタの順序を変更するとどうなりますか?
何も、コンストラクタの連鎖は、任意の順序で達成することができます
class
Temp
{
Temp()
{
System.out.println(
"default"
);
}
Temp(
int
x)
{
this
();
System.out.println(x);
}
Temp(
int
x,
int
y)
{
this
(
5
);
System.out.println(x * y);
}
public
static
void
main(String args)
{
new
Temp(
8
,
10
);
}
}
出力:
default580
メモ: 例1では、既定のコンストラクターが最後に呼び出されますが、例2では既定のコンストラクターが最初に呼び出されます。 したがって、コンストラクタ連鎖の順序は重要ではありません。
super()キーワードを使用して他のクラスに連鎖するコンストラクタ :
class
Base
{
String name;
Base()
{
this
(
""
);
System.out.println(
"No-argument constructor of"
+
" base class"
);
}
Base(String name)
{
this
.name = name;
System.out.println(
"Calling parameterized constructor"
+
" of base"
);
}
}
class
Derived
extends
Base
{
Derived()
{
System.out.println(
"No-argument constructor "
+
"of derived"
);
}
Derived(String name)
{
super
(name);
System.out.println(
"Calling parameterized "
+
"constructor of derived"
);
}
public
static
void
main(String args)
{
Derived obj =
new
Derived(
"test"
);
}
}
出力:
Calling parameterized constructor of baseCalling parameterized constructor of derived
注:同じクラスのコンストラクタチェーンと同様に、スーパークラスのコンストラクタがサブクラスのコンストラクタの前に呼び出されるため、super()はコンストラクタの最初の行にする必要があります。
代替方法:Initブロックを使用する:
特定の共通リソースをすべてのコンストラクタで実行したいときは、initブロックにコードを置くことができます。 Initブロックは、コンストラクタが新しいオブジェクトを作成するために使用されるたびに、常に任意のコンストラクタの前に実行されます。
例1:
class
Temp
{
{
System.out.println(
"init block"
);
}
Temp()
{
System.out.println(
"default"
);
}
Temp(
int
x)
{
System.out.println(x);
}
public
static
void
main(String args)
{
new
Temp();
new
Temp(
10
);
}
}
出力:
init blockdefaultinit block10
注:複数のブロックがある場合、それらは同じクラス内で定義されている順序で実行されます。 元を参照してください。
:
class
Temp
{
{
System.out.println(
"init"
);
}
Temp()
{
System.out.println(
"default"
);
}
Temp(
int
x)
{
System.out.println(x);
}
{
System.out.println(
"second"
);
}
public
static
void
main(String args)
{
new
Temp();
new
Temp(
10
);
}
}
出力:
initseconddefaultinitsecond10
この記事はApoorva singhによって貢献されています。 GeeksforGeeksが好きで、貢献したい場合は、contributeを使用して記事を書くこともできます。geeksforgeeks.orgまたはあなたの記事をに郵送して下さい[email protected]メインページに表示されるあなたの記事を参照してくださいし、他のオタクを助けます。