public class TestClass{
public static void main(String []args) {
TestClass t1 = new TestClass();
t1.anything();
}
}
これは完全に有効なコードです。メソッドが呼び出されたとき、main
前のインスタンスは存在しません(メソッドはTestClass
であるため、存在する必要はありません)。main
static
public class Test2{
public Test2 clone(){
return new Test2();
}
}
これも完全に有効です。Test2の新しいインスタンスを作成すると、clone
メソッドが含まれますが、メソッドは自動的に実行されません。メソッドが呼び出された場合にのみ、clone
Test2のインスタンスがもう1つ作成されます。
public class MyLinkedList{
MyLinkedList next;
MyLinkedList(int elems){
if(elems>0){
next = new MyLinkedList(elems-1);
}else{
next = null;
}
}
}
コンストラクターが同じコンストラクターを使用して新しいインスタンスを作成する場合でも、作成は条件付きで保護されているため、インスタンスを作成すると新しい作成がトリガーされることがあるため、も完全に有効です。
public class Fail{
public Fail(){
new Fail();
}
}
ここで問題となる唯一の例です。コンパイラは文句を言いません。バイトコードに変換して実行することができます。ただし、実行時にスタックオーバーフローが発生します。
- 新しい失敗が割り当てられます
- その引数なしのコンストラクターは呼び出されます
- コンストラクターは新しいFailを作成しようとします
- 新しい失敗が割り当てられます
- その引数なしのコンストラクターは呼び出されます
- ..。
一般に、コンパイラはすべての無限再帰を防ぐことができないため、コンパイラはこれを許可します。コンパイラは、バイトコードに変換できるものなら何でも許可します。
ただし、コンパイラがメソッドを検出した場合、またはメソッドチェーンが無条件に自分自身を呼び出した場合、コンパイラは警告を発行することがあります。