kagamihogeの日記

kagamihogeの日記です。

javaでextendsの階層を大量に深くする

javaでextendsの階層を深くしまくったらどうなるか? 理論的な裏付けは特に行わず、とりあえずやってみたら何が起きるか、を見る。

環境

  • java version "16" 2021-03-16

やったこと

こんな感じでひたすらextendsを重ねるクラスを生成し、コンパイルして実行してみる。

class A1 extends Object {
    public void m() {
        System.out.println("A1");
    }
}

class A2 extends A1 {
    public void m() {
        System.out.println("A2");
        super.m();
    }
}

//...(省略)

public class Main {
    public static void main(String[] args) {
        new A100().m();
    }
}

extendsが200で以下のようにStackOverflowErrorとなった。末尾最適利かないだろうから結果としては至極当然といったところか。

> java a.Main
Exception in thread "main" java.lang.StackOverflowError
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1010)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:855)

コンパイル時間は500で1分強、1000で数分。一気に60000は全く終わる気配が無くて途中であきらめた。

実行時間は、上記の事情があるので100しか試していないが、特に早いとか遅いとかは無かった。