很诡异的一个java问题public class MyHandle {public static int k 0public static int i print(i)
很诡异的一个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方法
[解决办法] 引用: Quote: 引用: 你那个有点乱套. .看看改良之后的. 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方法. .才开始执行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) 构造器被执行;
[解决办法] 引用: Quote: 引用: Quote: 引用: 你那个有点乱套. .看看改良之后的. 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 +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=静态变量