首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

很诡异的一个java有关问题

2013-09-28 
很诡异的一个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有关问题
[解决办法]
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=静态变量

热点排行