我正在看下面的代码,发现有点奇怪的东西:
public class Sequence {
Sequence() {
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go() {
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这会给出一个编译错误,因为System.out
"y"不属于方法声明只是一个{ }
.为什么这个有效?我没有看到这个代码将如何或应该被调用.
当运行它时它也产生x y c g
,为什么static { }
在序列构造函数之前调用get?
jlo*_*rdo 147
这个:
static {
System.out.print("x ");
}
Run Code Online (Sandbox Code Playgroud)
是一个静态初始化块,在加载类时调用.您可以根据需要在课堂上拥有尽可能多的课程,并按照外观(从上到下)执行.
这个:
{
System.out.print("y ");
}
Run Code Online (Sandbox Code Playgroud)
是一个初始化块,代码被复制到类的每个构造函数的开头.因此,如果您的类中有许多构造函数,并且它们都需要在开头做一些常见的操作,那么您只需要编写一次代码并将其放在像这样的初始化块中.
因此,您的输出非常有意义.
正如Stanley在下面评论的那样,请参阅Oracle教程中描述初始化块的部分以获取更多信息.
xyz*_*xyz 25
它不是一个方法,而是一个初始化块.
{
System.out.print("y ");
}
Run Code Online (Sandbox Code Playgroud)
它将在构造函数调用之前执行.而
static {
System.out.print("x ");
}
Run Code Online (Sandbox Code Playgroud)
是静态初始化块,在类加载器加载类时执行.
因此,当您运行代码时
1.类由类加载器加载,因此执行静态初始化块
输出:x打印
2.创建对象,以便执行初始化块,然后调用constuctor
输出:y打印后跟c
3.调用main方法,然后调用go方法
输出:g打印
最终输出:xycg
这可能有助于http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/
Luc*_*ore 16
这是一个实例初始化块,后跟一个静态初始化块.
{
System.out.print("y ");
}
Run Code Online (Sandbox Code Playgroud)
在创建类的实例时调用.
static {
System.out.print("x ");
}
Run Code Online (Sandbox Code Playgroud)
在类加载器加载类时调用.所以,当你这样做
new Sequence().go();
Run Code Online (Sandbox Code Playgroud)
类被加载,因此它执行static {}
,然后它执行实例初始化块{}
,然后调用构造函数的主体,然后调用新创建的实例上的方法.Ergo输出x y c g
.
Nar*_*hai 15
static {
System.out.print("x ");
}
Run Code Online (Sandbox Code Playgroud)
是一个静态块,在类加载期间调用
{
System.out.print("y ");
}
Run Code Online (Sandbox Code Playgroud)
是一个初始化块
您可以在一个类中有多个初始化块,在这种情况下,它们按照它们在类中出现的顺序执行.
请注意,类中存在的任何初始化块都在构造函数之前执行.
Ter*_* Li 10
static {
System.out.print("x ");
}
Run Code Online (Sandbox Code Playgroud)
是由类共享的初始化块(如所示static
),首先执行该初始化块.
{
System.out.print("y ");
}
Run Code Online (Sandbox Code Playgroud)
是类的所有对象(构造函数)共享的初始化块,接下来是.
Sequence() {
System.out.print("c ");
}
Run Code Online (Sandbox Code Playgroud)
是类的特定构造函数,它是第三个执行的.每次执行构造函数时,都会首先调用实例初始化块.这就是"y"出现在"c"之前的原因.
void go() {
System.out.print("g ");
}
Run Code Online (Sandbox Code Playgroud)
只是一个与使用上面的构造函数构造的对象相关联的实例方法,它最后出现.
{
System.out.print("y ");
}
Run Code Online (Sandbox Code Playgroud)
这些类型的块被称为initializer block
.每次创建一个实例时都会执行它class
.在编译时,此代码将移动到您的类的每个构造函数中.
在static initializer
块的情况下: -
static {
System.out.println("x ");
}
Run Code Online (Sandbox Code Playgroud)
它在加载类时执行一次.我们一般static
在初始化static
字段时使用初始化块,需要多个步骤.
归档时间: |
|
查看次数: |
9537 次 |
最近记录: |