java中的静态块和对象块访问

java中的静态块和对象块访问,java,jvm,Java,Jvm,我阅读了下面提到的对象块: class Check { static { System.out.println("hello from Static"); } //object block { System.out.println("This is my object block"); } public static void main(String args[]) { } } 这是程序的输出 Hell

我阅读了下面提到的对象块:

class Check {

    static {
        System.out.println("hello from Static");
    }
    //object block
    {
        System.out.println("This is my object block");
    }

    public static void main(String args[]) {
    }
}
这是程序的输出

Hello from Static
但当我创建类的对象时,对象块被执行。我无法理解jvm是如何完成这个过程的。有垃圾收集器的角色吗

class Check {

    static {
        System.out.println("hello from Static");
    }
    //object block

    {
        System.out.println("This is my object block");
    }

    public static void main(String args[]) {
        System.out.println("hello from main");
        Check obj = new check();
    }
}
这是输出:

hello from Static
hello from main
This is my object block

根据Java语言规范,静态块将在类装入器装入并由类装入器初始化时执行。对于初始化块,它们将在实例化类时执行


请参阅Java语言规范1.6中的章节和。根据Java语言规范,静态块将在类加载程序加载和初始化类时执行。对于初始化块,它们将在实例化类时执行


请参阅Java语言规范1.6中的章节,每当类加载到JVM中时,都会执行静态块。 而对象块或构造函数块将在您创建所述对象的实例时运行

本文很好地描述了这些差异:

每当将类加载到JVM中时,就会执行静态块。 而对象块或构造函数块将在您创建所述对象的实例时运行

本文很好地描述了这些差异: 事件的顺序

该类已初始化,从静态打印hello 调用main方法,从main打印hello 对象已构建,打印这是我的对象块 事件的顺序

该类已初始化,从静态打印hello 调用main方法,从main打印hello 对象已构建,打印这是我的对象块 静态块在类加载器加载类时执行,这通常是每个JVM实例执行一次,但我认为您可能会创建一些非常奇怪的情况,即您有多个类加载器都加载该类;不过,这不是一个非常初级的情况。每次创建该类或其子类的实例时,都会执行实例初始值设定项块。您的计划要求:

该类由JVM加载;这将从static触发静态初始值设定项块hello。 执行主静态方法 println从main执行。 创建Check的一个实例。这将触发实例初始值设定项,从而导致这是我的对象块。 GC与您所询问的行为无关,FTR。

每当类加载器加载类时,静态块就会被执行这通常是每个JVM实例执行一次,但我想您可能会创建一些非常奇怪的情况,即您有多个类加载器都加载该类;不过,这不是一个非常初级的情况。每次创建该类或其子类的实例时,都会执行实例初始值设定项块。您的计划要求:

该类由JVM加载;这将从static触发静态初始值设定项块hello。 执行主静态方法 println从main执行。 创建Check的一个实例。这将触发实例初始值设定项,从而导致这是我的对象块。
GC与您所询问的行为无关,FTR。

假设i类中的sir有1.static varable 2.static block 3.static method 4.main method 5.simple method 6.simple variable 7.constructor,它们是以何种方式执行的。@PradeepBhati如果您需要该级别的详细信息,您可能应该阅读。如果您这样做了,可能是为了某种测试,您将需要最正式的数据源。如果你在现实世界中遇到这种事情,你最好简化你的逻辑。如果你在写这篇文章的时候花了很长时间去思考,这是一个好兆头。当您在进行维护时,您需要花很长时间才能重新理解它,并且在您忘记所有上下文后再次遇到它。事实上,我是从**herbert schildt**学习java的。在那本书中,没有更多关于静态的信息,我在这里学习,谢谢您,先生guidence.@PradeepBhati一般来说,静态初始值设定项和类初始值设定项在加载类时按照它们在文件文本中出现的顺序运行,这必须在引用该类之前发生,例如:访问类成员、变量或方法。这意味着,在实例化类之前,这些类将始终执行一次。当您实例化一个类时,首先执行实例初始化器和实例变量初始化器,然后执行用于实例化该类的构造函数。假设类i中的sir有1.static varable 2.static block 3.static method 4.main method 5.simple method 6.simple variable 7.constructor,其中
h它们的执行方式。@PradeepBhati如果需要这种详细程度,您可能应该去阅读。如果您这样做了,可能是为了某种测试,您将需要最正式的数据源。如果你在现实世界中遇到这种事情,你最好简化你的逻辑。如果你在写这篇文章的时候花了很长时间去思考,这是一个好兆头。当您在进行维护时,您需要花很长时间才能重新理解它,并且在您忘记所有上下文后再次遇到它。事实上,我是从**herbert schildt**学习java的。在那本书中,没有更多关于静态的信息,我在这里学习,谢谢您,先生guidence.@PradeepBhati一般来说,静态初始值设定项和类初始值设定项在加载类时按照它们在文件文本中出现的顺序运行,这必须在引用该类之前发生,例如:访问类成员、变量或方法。这意味着,在实例化类之前,这些类将始终执行一次。实例化类时,首先执行实例初始值设定项和实例变量初始值设定项,然后执行用于实例化类的构造函数。