デフォルトコンストラクタ
日本語 | 掛かり付け大工 |
英語 | default constructor |
ふりがな | でふぉるとこんすとらくたー |
フリガナ | デフォルトコンストラクター |
コンストラクタの種類のひとつ。
作らなくても存在するコンストラクタ。
クラスがコンストラクタを全く持たない場合に、コンパイラが自動的に作成する。ソースコード上は存在しない。
引数は持たず、実装はsuper()によりスーパークラスのコンストラクタを呼び出すのみであり、当然フィールドの初期化等は行わない。
デフォルトコンストラクタは、引数を持つコンストラクタを作ると消えてしまうため、その場合には引数のないコンストラクタを作る必要がある。
というよりは、基本的にデフォルトコンストラクタは使用すべきではない。引数を持つコンストラクタを作るとデフォルトコンストラクタがなくなるのは、もし存在していたら「フィールドの初期化し忘れ」が発生する可能性大のためである。
たとえフィールドの初期化が必要なく、デフォルトコンストラクタのみで事足りるとしても、安全性の面から、引数なしのコンストラクタを作成することを勧める。
作らなくても存在するコンストラクタ。
クラスがコンストラクタを全く持たない場合に、コンパイラが自動的に作成する。ソースコード上は存在しない。
引数は持たず、実装はsuper()によりスーパークラスのコンストラクタを呼び出すのみであり、当然フィールドの初期化等は行わない。
デフォルトコンストラクタは、引数を持つコンストラクタを作ると消えてしまうため、その場合には引数のないコンストラクタを作る必要がある。
というよりは、基本的にデフォルトコンストラクタは使用すべきではない。引数を持つコンストラクタを作るとデフォルトコンストラクタがなくなるのは、もし存在していたら「フィールドの初期化し忘れ」が発生する可能性大のためである。
たとえフィールドの初期化が必要なく、デフォルトコンストラクタのみで事足りるとしても、安全性の面から、引数なしのコンストラクタを作成することを勧める。
参考サイト
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// コンストラクタを持たないクラスでもインスタンスを作れます。
// これは、見えないコンストラクタ「デフォルトコンストラクタ」が
// 存在するためです。
new NotImplementedConstructor();
// 引数付きコンストラクタだけを持つクラスの場合、
// デフォルトコンストラクタは消えてしまいます。
// new ImplementedParameterConstructor();
// コンストラクター ImplementedParameterConstructor() は未定義です。
// 代わりに引数なしコンストラクタを作れば
// 同じように呼び出すことができますが、もはやこれは
// 「デフォルトコンストラクタ」ではありません。
new ImplementedConstructor();
// ImplementedConstructor#ImplementedConstructor()
}
}
/**
* コンストラクタを持たないクラス。
*/
class NotImplementedConstructor
{
}
/**
* 引数付きコンストラクタだけを持つクラス。
*/
class ImplementedParameterConstructor
{
/**
* 引数付きコンストラクタ。
*/
public ImplementedParameterConstructor( int i )
{
System.out.println( "ImplementedParameterConstructor#ImplementedParameterConstructor( int ): " + i );
}
}
/**
* コンストラクタを持つクラス。
*/
class ImplementedConstructor
{
/**
* 引数なしコンストラクタ。
*/
public ImplementedConstructor()
{
System.out.println( "ImplementedConstructor#ImplementedConstructor()" );
}
/**
* 引数付きコンストラクタ。
*/
public ImplementedConstructor( int i )
{
System.out.println( "ImplementedConstructor#ImplementedConstructor( int ): " + i );
}
}
public class Sample
{
public static void main( String[] args )
{
// コンストラクタを持たないクラスでもインスタンスを作れます。
// これは、見えないコンストラクタ「デフォルトコンストラクタ」が
// 存在するためです。
new NotImplementedConstructor();
// 引数付きコンストラクタだけを持つクラスの場合、
// デフォルトコンストラクタは消えてしまいます。
// new ImplementedParameterConstructor();
// コンストラクター ImplementedParameterConstructor() は未定義です。
// 代わりに引数なしコンストラクタを作れば
// 同じように呼び出すことができますが、もはやこれは
// 「デフォルトコンストラクタ」ではありません。
new ImplementedConstructor();
// ImplementedConstructor#ImplementedConstructor()
}
}
/**
* コンストラクタを持たないクラス。
*/
class NotImplementedConstructor
{
}
/**
* 引数付きコンストラクタだけを持つクラス。
*/
class ImplementedParameterConstructor
{
/**
* 引数付きコンストラクタ。
*/
public ImplementedParameterConstructor( int i )
{
System.out.println( "ImplementedParameterConstructor#ImplementedParameterConstructor( int ): " + i );
}
}
/**
* コンストラクタを持つクラス。
*/
class ImplementedConstructor
{
/**
* 引数なしコンストラクタ。
*/
public ImplementedConstructor()
{
System.out.println( "ImplementedConstructor#ImplementedConstructor()" );
}
/**
* 引数付きコンストラクタ。
*/
public ImplementedConstructor( int i )
{
System.out.println( "ImplementedConstructor#ImplementedConstructor( int ): " + i );
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // コンストラクタを持たないクラスでもインスタンスを作れます。 // これは、見えないコンストラクタ「デフォルトコンストラクタ」が // 存在するためです。 new NotImplementedConstructor(); // 引数付きコンストラクタだけを持つクラスの場合、 // デフォルトコンストラクタは消えてしまいます。 // new ImplementedParameterConstructor(); // コンストラクター ImplementedParameterConstructor() は未定義です。 // 代わりに引数なしコンストラクタを作れば // 同じように呼び出すことができますが、もはやこれは // 「デフォルトコンストラクタ」ではありません。 new ImplementedConstructor(); // ImplementedConstructor#ImplementedConstructor() } } /** * コンストラクタを持たないクラス。 */ class NotImplementedConstructor { } /** * 引数付きコンストラクタだけを持つクラス。 */ class ImplementedParameterConstructor { /** * 引数付きコンストラクタ。 */ public ImplementedParameterConstructor( int i ) { System.out.println( "ImplementedParameterConstructor#ImplementedParameterConstructor( int ): " + i ); } } /** * コンストラクタを持つクラス。 */ class ImplementedConstructor { /** * 引数なしコンストラクタ。 */ public ImplementedConstructor() { System.out.println( "ImplementedConstructor#ImplementedConstructor()" ); } /** * 引数付きコンストラクタ。 */ public ImplementedConstructor( int i ) { System.out.println( "ImplementedConstructor#ImplementedConstructor( int ): " + i ); } }