首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中使用静态块的必要性

Java中使用静态块的必要性
EN

Stack Overflow用户
提问于 2012-12-22 01:56:57
回答 7查看 30.3K关注 0票数 56

我发现在Java语言中,有一个叫做static block的特性,它包含了在第一次加载一个类时执行的代码(我不明白“加载”是什么意思,它是指初始化的吗?)有没有理由在静态块中而不是在构造函数中进行初始化?我的意思是,即使构造函数也做同样的事情,当一个类第一次被初始化时,做所有必要的事情。静态块有没有什么构造函数做不到的事情呢?

EN

回答 7

Stack Overflow用户

发布于 2012-12-22 01:58:52

在创建类的实例时调用构造函数。

静态块在类加载器加载这个类定义时被调用,这样我们就可以初始化这个类的静态成员。我们不应该从构造函数初始化静态成员,因为它们是类定义的一部分,而不是对象

票数 18
EN

Stack Overflow用户

发布于 2012-12-22 03:39:56

如果我们初始化一个类,静态初始化器就会运行,这不需要我们实例化一个类。但构造函数只有在我们创建类的实例时才会运行。

例如:

class MyClass
{   
    static
    {
        System.out.println("I am static initializer");
    }
    MyClass()
    {
        System.out.println("I am constructor");
    }

    static void staticMethod()
    {
        System.out.println("I am static method");
    }
}

如果我们运行:

MyClass.staticMethod();

输出:

I am static initializer
I am static method

我们从未创建过实例,所以构造函数不会被调用,但会调用静态初始化器。

如果我们创建一个类的实例,静态初始化器和构造函数都会运行。没什么好惊讶的。

MyClass x = new MyClass();

输出:

I am static initializer
I am constructor

请注意,如果我们运行:

MyClass x;

输出:(空)

声明变量x不需要初始化MyClass,因此静态初始化器不会运行。

票数 9
EN

Stack Overflow用户

发布于 2012-12-22 01:58:42

这是两件不同的事情。使用构造函数初始化类的一个实例时,静态初始化块在加载该类时初始化静态成员。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13994950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档