構築方法について

3147 ワード

package net.javayuan.test;

public class ConstructorTest {

	public static void main(String[] args){
		Sup sub1 = new Sub();
	}
}

class Sup{
	public Sup(){
		System.out.println("sup()");
	}
}

class Sub extends Sup{

}

出力:sup()
サブクラスにコンストラクションメソッドが定義されていない場合、デフォルトのパラメータなしコンストラクションメソッドが呼び出されます.同時に、このパラメータなし構築メソッドはsuper()、すなわち親クラスのパラメータなし構築メソッドを自動的に呼び出します.


class Sub extends Sup{
	public Sub(){
		
	}
}

出力:sup()
サブクラスが無パラメータ構造方法を定義しているが,メソッド体には何も書かれていない場合,この無パラメータ構造方法の書くことと書かないことには区別がない.サブクラスをインスタンス化する場合も、サブクラスのパラメータなし構築メソッドを先に呼び出し、super()を自動的に呼び出します.前のコードと比較して,ここでは無パラメータ構造法を明示的に宣言したにすぎず,以前のコード中性子系無パラメータ構造法は暗黙的であった.
class Sub extends Sup{
	public Sub(){
		super();
	}
}

出力:sup()
同様に、このコードは前のセグメントと比較して、super()を明示的に呼び出すだけです.前のコード対super()の呼び出しは暗黙的である.
別のコードを書き直します.
package net.javayuan.test;
/**
 * @(#)ConstructorTest.java 2008-8-1  10:14:56
 * 
 * @author Yuan
 *  
 */
public class ConstructorTest {

	public static void main(String[] args){
		Sup sub1 = new Sub(1);
	}
}

class Sup{
	public Sup(int i){
		System.out.println("sup(int)");
	}
}

class Sub extends Sup{
	
}

ヒントSubクラスはコンパイルできません:
参照
The constructor Sub(int) is undefined
Implicit super constructor Sup() is undefined for default constructor. Must define an explicit constructor
サブクラスはintパラメータを1つ持つ構造方法を提供していないため、ここでのサブクラスにはデフォルトのパラメータなし構造方法があり、親クラスのパラメータなし構造方法を暗黙的に呼び出し、親クラスはintパラメータを1つ持つ構造方法を明示的に定義した後、その暗黙的なパラメータなし構造方法は存在せず、明示的に定義する必要があるため、コンパイルできません.
Supに対して明示的な無パラメトリック構造方法を定義した後、コードは以下の通りである.
package net.javayuan.test;
/**
 * @(#)ConstructorTest.java 2008-8-1  10:14:56
 * 
 * @author Yuan
 *  
 */
public class ConstructorTest {

	public static void main(String[] args){
		Sup sub1 = new Sub(1);
	}
}

class Sup{
	
	public Sup(){
		System.out.println("sup()");
	}
	
	public Sup(int i){
		System.out.println("sup(int)");
	}
}

class Sub extends Sup{
	
}

クラスConstructorTestはコンパイルできません.プロンプトは次のとおりです.
参照
The constructor Sub(int) is undefined
前のセグメントのコードと同様に,サブクラスはintパラメータ付きの構造方法を1つも提供しておらず,ConstructorTestクラスはコンパイルできない.
Subクラスのコードを変更するには:
class Sub extends Sup{
	
	public Sub(int i){
		
	}
}

出力:sup()
サブクラス構築メソッドには、親の任意の構築メソッドが明示的に呼び出されません.この場合、デフォルトでは、親のパラメータなし構築メソッドが呼び出されます.すなわち、ここには、サブクラス構築メソッドに暗黙的なsuper()があります.
class Sub extends Sup{
	
	public Sub(int i){
		super(i);
	}
}

出力:sup(int)
ここで,親クラスのintパラメータを1つ持つ構造方法を明示的に呼び出すと,親クラスのパラメータなし構造方法は自動的に呼び出されなくなる.