public class InstanceInitTest{
{
a = 6;
}
int a = 9;
public static void main(String[] args)
{
System.out.println(new InstanceInitTest().a);
}}
初始化代码块中的变量,为什么可以不需要声明数据类型?如上, a=6; 并没有声明类型。
public class InstanceInitTest{
{
a = 6;
}
int a = 9;
public static void main(String[] args)
{
System.out.println(new InstanceInitTest().a);
}}
初始化代码块中的变量,为什么可以不需要声明数据类型?如上, a=6; 并没有声明类型。
当一个类从被JVM装载开始,各种代码的执行顺序大致如下:
被JVM装载->执行父类的相关代码->如果有静态初始化,先执行静态初始化,且只执行一次,以后即使有该类实例化,也不会再执行->如果有静态代码块,以与静态初始化一样的方式执行->如果有new语句带来的实例化,先为成员变量分配空间,并绑定参数列表,隐式或显式执行super(),即父类的构造方法,->执行非静态代码块-〉执行本类的构造函数-〉执行其他代码
做了一下测试,Test.java代码如下:
package com.practice.capter11;
public class Test {
{
a = 6;
}
int a = 9;
public static void main(String[] args) {
System.out.println(new Test().a);
}
}
下面是编译之后的Test.class文件:
package com.practice.capter11;
import java.io.PrintStream;
public class Test
{
int a = 6;
public static void main(String[] args)
{
System.out.println(new Test().a);
}
}
可以看出,java文件的初始化顺序是先执行
int a = 9;
然后执行代码快中的代码
{
a = 6;
}
所以这个时候,a 的类型已经定义了,即使int类型。
但是这里我也有一个疑问,执行代码,输出的结果是9.很不理解。希望有人可以解惑一下啦。
我说一下,如有错误,清指出。
1. 题主说的为什么{}
中的a
可以不声明类型呢,因为后面的int a = 9
已经声明了。
2. 题主应该查一下以下的区别(代码块
/静态块
):
{
a = 6;
}
int a = 9;
和
static{
a = 6;
}
static int a = 9;
3. 顺便查一下:普通代码块
;构造代码块
;静态代码块
;同步代码块
当然啦,题主的是构造代码块
,它的执行是先于new
操作的构造方法的。
静态块优先于主方法的执行,静态块优先于构造方法的执行,而且只执行一次
先说这么些了,虽然没有直接解决题主的问题,但是给个思路也行吧,后面就是自己google了。
15 回答7.2k 阅读
2 回答3.5k 阅读✓ 已解决
3 回答7.1k 阅读✓ 已解决
5 回答4.8k 阅读
3 回答5.3k 阅读
4 回答2.4k 阅读
2 回答2.4k 阅读✓ 已解决
对象实例化过程中,先声明所有的属性,给属性分配空间,然后是赋值。声明是优先于赋值的。
你所看到的是你自己逻辑顺序,而不是程序执行逻辑顺序,这点弄明白就没问题了