この質問を読んだことクラスがJVMにロードされるときに、クラスのさまざまな部分がどのような順序で初期化されますか?および関連するJLS。たとえば、クラスAnimal(スーパークラス)とクラスDog(サブクラス)が次のようになっている理由を詳しく知りたいと思います。
class Animal
{
static{
System.out.println("This is Animal's static block speaking"):
}
{
System.out.println("This is Animal's instance block speaking");
}
class Dog{
static{
System.out.println("This is Dog's static block speaking");
}
{
System.out.println("This is Dog's instance block speaking");
}
public static void main (String [] args)
{
Dog dog = new Dog();
}
}
クラスをインスタンス化する前に、その直接のスーパークラスを初期化する必要があります(したがって、すべての静的変数とブロックを実行する必要があります)。したがって、基本的に問題は、スーパークラスの静的変数と静的ブロックを初期化した後、インスタンスメンバーの初期化を終了するのではなく、静的変数の初期化のために制御がサブクラスに下がるのはなぜですか?
コントロールは次のようになります。
superclass (Animal): static variables and static blocks
subclass (Dog): static variables and static blocks
superclass (Animal): instance variables and instance blocks
sublcass (Dog):instance variables and instance blocks
それがこのようにではなく、このようになっている理由は何ですか:
superclass -> static members
superclass -> instance members
subclass -> static members
sublcass-> instance members