很诡异的一个java问题
public class MyHandle {
public static int k = 0;
public static int i = print("i");
public static int n = 99;
public MyHandle(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
++i;
System.out.println("MyHandle=======");
}
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
System.out.println("print=====");
return ++n;
}
public static void main(String[] args) {
System.out.println("=====zz");
}
}
我一直的理解是java代码是从入口函数main函数开始执行的,但是这里运行的结果是
1:i i=0 n=0
print=====
=====zz
难道是我错了吗?求解释。。。。 java
[解决办法]
一个类中如果有静态代码块,先执行静态代码块。
[解决办法]
你那个有点乱套. .看看改良之后的.
public class MyHandle {
public static String str = "静态变量";
public static int i =print("参数");
public MyHandle() {
System.out.println("构造方法");
}
public static int print(String str) {
System.out.println("静态方法"+":"+str);
System.out.println(i);
return 1;
}
public static void main(String[] args) {
System.out.println("Main方法");
}
}
顺序是 静态变量 -> 静态方法 -> main方法
[解决办法]
不应该这么理解吧. .
应该是虚拟机先初始化类...初始化的时候 静态的东西都放到内存里了. .所以就先被执行了. .
初始化之后. 发现类中有main方法. .才开始执行main方法
[解决办法]
顺序没有问题
先 对 static k 进行赋值 0;
然后对 static i 赋值,进入方法print("i");
此时 i还没值,所以初始值为0,n也还没有赋值,初始值为0
所以print("i");
运行之后的结果是
1:i i=0 n=0
print=====
print("i")的返回值是1,所以i = 1;
接着对 static n进行赋值,变成n = 99了。
接着进入main方法,打印
=====zz
public static void main(String[] args) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=====zz");
}
加个thread可以看得出来,先进入静态变量声明,在进入静态方法。
[解决办法]
main函数是在一个类中,而这个类并不是只有main函数,当类中含有静态代码块时,代码块是默认先执行的
[解决办法]
顺序是 静态变量 -> 静态方法 -> main方法
[解决办法]
static块会优先执行,然后才是函数入口
[解决办法]
一般情况下,静态代码块在程序启动的时候就执行的了,优于main入口函数。至于i=0,n=0;是因为int默认缺省值是0.静态代码块最先执行!!!

[解决办法]
java 初始化顺序
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
[解决办法]
抄网上的:
类被装载后同时在main方法被调用之前,必须对类HelloApp与其它类型进行链接然后初始化。链接包含三个阶段:检验,准备和解析。检验检查被装载的主类的符号和语义,准备则创建类或接口的静态域以及把这些域初始化为标准的默认值,解析负责检查主类对其它类或接口的符号引用,在这一步它是可选的。
[解决办法]
这实际上是JVM对类始化造成的,类初始化之前JVM先加载该类到内存并在内存中将该类的二进制数据合并到JRE中。
JVM对类初始化时主要是初始化类的静态Field,所以执行"public static int i = print("i");"时,会先调用print(String str)函数。
静态属性初始化完成后,才到类的执行阶段,即执行main()函数体。
也就是说,执行main()之前,JVM先做了对静态属性初始化的工作,初始化完成后才执行main()
[解决办法]
对象的构造过程:
(1) 分配内存空间;
(2) 实例域被初始化为默认值;
(3) 如果使用方法调用进行初始化赋值,则执行该方法;
(4) 实例初始化块被执行;
(5) 构造器被执行;
[解决办法]
+1
你那个有点乱套. .看看改良之后的.
public class MyHandle {
public static String str = "静态变量";
public static int i =print("参数");
public MyHandle() {
System.out.println("构造方法");
}
public static int print(String str) {
System.out.println("静态方法"+":"+str);
System.out.println(i);
return 1;
}
public static void main(String[] args) {
System.out.println("Main方法");
}
}
顺序是 静态变量 -> 静态方法 -> main方法
+1
这种情况呢:
public class ForTest {
public static int i =print("参数");
public static String str = "静态变量";
public ForTest() {
System.out.println("构造方法");
}
public static int print(String str1) {
System.out.println("静态方法"+":"+str1);
System.out.println("str="+str);
System.out.println(i);
return 1;
}
public static void main(String[] args) {
System.out.println("Main方法");
System.out.println("str="+str);
}
}
结果:
静态方法:参数
str=null
0
Main方法
str=静态变量
