【问题标题】:static block instance block java Order静态块实例块java顺序
【发布时间】:2013-03-06 17:46:56
【问题描述】:

已阅读此问题In what order are the different parts of a class initialized when a class is loaded in the JVM? 和相关的 JLS。我想更详细地了解为什么例如具有以下动物类(超类)和狗类(子类):

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

【问题讨论】:

  • 我正在努力想出一个这甚至很重要的例子(鉴于超类对子类一无所知)。

标签: java block execution


【解决方案1】:

为什么在初始化超类的静态变量和静态块之后,控制权交给子类进行静态变量初始化,而不是完成实例成员的初始化?

因为静态初始化发生一次,在创建任何个实例之前。

静态对应类,非静态对应特定实例。

【讨论】:

    【解决方案2】:

    如果你创造更多的狗是有意义的

    superclass (Animal): static variables and static blocks
    subclass   (Dog)   : static variables and static blocks
    
    superclass (Animal): instance variables and instance blocks
    subclass   (Dog)   : instance variables and instance blocks
    
    superclass (Animal): instance variables and instance blocks
    subclass   (Dog)   : instance variables and instance blocks
    
    superclass (Animal): instance variables and instance blocks
    subclass   (Dog)   : instance variables and instance blocks
    

    【讨论】:

      猜你喜欢
      • 2022-12-22
      • 2011-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      相关资源
      最近更新 更多