javaの無参画構造器とsuper()
3308 ワード
1.クラスで他の有参のコンストラクタを提供したら、コンパイラはデフォルトの無参画コンストラクタを提供しない。
3.もしあなたがコンストラクタを提供したら、手動でsuper()を追加する必要がなく、コンストラクタはデフォルトで追加されます。
6.コンストラクタにthisを追加した場合、このクラスの他のコンストラクタを引用したり、super()を追加して父のコンストラクタを呼び出したりします。thisとsuperにパラメータがあれば、静的な方法と静的変数または定数だけです。
getRondomNameメソッド前のstaticを取り除くと、エラーが発生します。Canot refer to an instance method while explicitly invoking a constructor
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