javaの無参画構造器とsuper()

3308 ワード

1.クラスで他の有参のコンストラクタを提供したら、コンパイラはデフォルトの無参画コンストラクタを提供しない。
class Animal {
	Animal(String name) { }
	public static void main(String[] args){
		Animal a = new Animal();
	}
}
このセグメントコードのコンパイルは通りません。エラーメッセージは以下の通りです。
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The constructor Animal() is undefined
2.クラスでコンストラクタが提供されていない場合、コンパイラはデフォルトのコンストラクタを提供します。
class Animal {
	public static void main(String[] args){
		Animal a = new Animal();
	}
}
このセグメントコードは順調にコンパイルされます。
3.もしあなたがコンストラクタを提供したら、手動でsuper()を追加する必要がなく、コンストラクタはデフォルトで追加されます。
class Animal {
	Animal (){
		System.out.println("----Animal     -----");
	}
}
class Horse extends Animal {
	Horse() {
//		super(); //             
		System.out.println("----Horse     -----");
	}
	Horse(int a) {
//		super(); //             
		System.out.println("----Horse     -----");
	}
	public static void main(String[] args){
		Horse a = new Horse();
		Horse b = new Horse(3);
	}
}
印刷情報は以下の通りです。
----Animal     -----
----Horse     -----
----Animal     -----
----Horse     -----
4.親が無参画構造器を提供していない場合、サブクラスはエラーを報告する:
class Animal {
	Animal (int a){
		System.out.println("----Animal     -----");
	}
}
class Horse extends Animal {
	Horse() {
		System.out.println("----Horse     -----");
	}
	public static void main(String[] args){
		Horse a = new Horse();
	}
}
コードはコンパイルできません。エラーは以下の通りです。
Implicit super constructor Animal() is undefined. Must explicitly invoke another constructor
5.コンストラクタにthisを追加した場合、このクラスの他のコンストラクタを参照するか、またはsuper()を追加して父コンストラクタを呼び出す場合、thisとsuperはコンストラクタの最初の行にしなければなりません。thisは他のコンストラクタとsuper()の文を参照すると同時に現れません。
class Animal {
	Animal (){
		System.out.println("----Animal     -----");
	}
}
class Horse extends Animal {
	String name;
	Horse() {
		System.out.println("----Horse     -----");
		this(" ");  //    ,
	}
	Horse(String name){
		this.name = name;
	}
}
具体的なエラーメッセージは、Costructor cal must be the first statement in a constructorです。
6.コンストラクタにthisを追加した場合、このクラスの他のコンストラクタを引用したり、super()を追加して父のコンストラクタを呼び出したりします。thisとsuperにパラメータがあれば、静的な方法と静的変数または定数だけです。
class Animal {
	Animal (){
		System.out.println("----Animal     -----");
	}
}
class Horse extends Animal {
	String name;
	Horse() {
		this(getRondomName()); //   A
		System.out.println("----Horse     -----");
	}
	Horse(String name){
		System.out.println("----Horse     -----"); //   B
		this.name = name;
	}
	static String getRondomName(){
		int x = (int) (Math.random() * 5);
		String name = new String[] {" ", " ", " ", " "," "}[x];
		return name;
	}
	public static void main(String[] args){
		Horse a = new Horse();
	}
}
印刷結果は以下の通りです。
----Animal     -----
----Horse     -----
----Horse     -----
thisが他のコンストラクタを参照すると、super()はこのコンストラクタでは呼び出されないので、super()はコードセグメントBの前の行で呼び出され、コードセグメントAの前の行ではない。
getRondomNameメソッド前のstaticを取り除くと、エラーが発生します。Canot refer to an instance method while explicitly invoking a constructor