Java 静态块和正常块

Java 静态块和正常块,java,Java,我知道静态块在主块之前运行。 但是,正常的块是在main之前运行还是在main之后运行 class prog { static { System.out.println("Static"); } { System.out.println("Block"); } public static void main(String args[]) { prog obj=new prog(); System.out.println("Main"); } } 无论何时实例化对象,非静态块one都会运行,在

我知道静态块在主块之前运行。 但是,正常的块是在main之前运行还是在main之后运行

class prog
{
static
{
System.out.println("Static");
}
{
System.out.println("Block");
}

public static void main(String args[])
{
prog obj=new prog();
System.out.println("Main");
}
}

无论何时实例化对象,非静态块one都会运行,在您的示例中,
inmain
。在
prog obj=new prog()之前尝试打印一些内容

如果我有下面这样的东西,它会在main之前运行

class prog {
    static {
        System.out.println("Static");
    }
    {
        System.out.println("Block");
    }

    prog obj = new prog();
    public static void main(String args[]) {
        System.out.println("Main");
    }
}

实际上,静态块或SIB(静态初始化块)在类加载时加载,因此它在main()之前执行

但非静态块或IIB(实例初始化块)的情况并非如此,它仅在对象创建(实例)时加载,因为名称也阐明了相同的


我想你明白我的意思了。

静态块是一个块,在这个块中,如果我们指定任何变量或静态类,我们可以通过它的类名访问它的数据成员到另一个类中或该类之外。 普通块是在其中创建类或该类的对象的块。如果我们想在另一个类中使用它,我们必须创建该类的构造函数,然后才能访问其对象。
所以这是静态块和普通块的主要区别,普通块将在编译时创建该类的实例时运行。静态块在程序执行过程中只运行一次。因此,如果您希望在创建该类的实例之前打印一些内容,请将其放入静态块中。

加载类时执行静态块,创建包含该块的类的实例时执行普通块。

仅针对java之前的记录,在项目中搜索main()方法之前执行了7个静态块。但是从Java7开始,main()是首先查找的。因此,如果没有main,您将得到一个错误。因此说
我知道静态块在main之前运行有点含糊不清。main()方法是在执行静态块之前查找的,但主执行将在处理静态块之后开始

在调用相应的构造函数之前,也会执行非静态块。 比如说

public class Tester {

{
    System.out.println("In some random block");
}

static {
    System.out.println("In static block");
}

public Tester() {
    System.out.println("Constructor");
}


public static void main(String args[]) {
    Tester t = new Tester();
}


}
将打印

In static block
In some random block
Constructor

当一个类的实例被实例化时,运行普通的init块。静态方法,比如main,不需要实例,所以这两个东西是不相关的。

为什么不自己运行并查看呢?!说真的,在您最喜欢的IDE中运行这段代码会更容易。如果您手头没有静态块,请更具体地说,使用静态块在加载类时运行…在main之前很早就有了。每当您实例化包含这些块的类的对象时,就会运行非静态块。此外,值得一提的是,类中的非
静态
代码块将在执行类构造函数之前执行。请参见“是”,非静态块是编译器为所有类生成的
init
方法的一部分,该方法在构造函数之前运行。