日期:2014-05-20  浏览次数:20758 次

一个学习中发现的问题,请明白人来解答
[size=24px]package com.shengsiyuan.io;

import java.util.Random;

public class CharacterUtil
{
public static final int randomPort1= generator();

public static int generator()
{

Random ran = new Random();
int num = ran.nextInt(1000);
return num;



  }

}


2.package com.shengsiyuan.io;

public class Test2
{

public static void main(String[] args)
{
int a = CharacterUtil.randomPort1;
System.out.println(a);





}


}
3.package com.shengsiyuan.io;

import java.util.Random;

public class Test3 extends Thread
{

public static void main(String[] args)
{

int num1 = CharacterUtil.randomPort1;


int num2 = CharacterUtil.randomPort1;
System.out.println(num1);
System.out.println(num2);


}

}
两个类都调用了,CharacterUtil类,但是Test3类的输出结果num1,num2,是一样的,但是为什么会和Test2中的结果不一样,请问类之间的调用关系是什么样的?内部的执行是怎样的?求高手指教!











------解决方案--------------------
因为
public static final int randomPort1= generator();
这个是常量,对于Test3来说只调用一次generator(); randomPort1不再改变,所以两次是一样的
对于Test2来说,每次都回重新启动运行(main方法启动),所以generator()在每次启动获得的值不同,所以不一样



------解决方案--------------------
1、public static final int randomPort1= generator();
改为 public int randomPort1= generator();
2、Test3中改为: CharacterUtil c1 = new CharacterUtil();
CharacterUtil c2 = new CharacterUtil();
int num1 = c1.randomPort1;
int num2 = c2.randomPort1;
main方法是static的,只能调用static的属性。
------解决方案--------------------
探讨

因为
public static final int randomPort1= generator();
这个是常量,对于Test3来说只调用一次generator(); randomPort1不再改变,所以两次是一样的
对于Test2来说,每次都回重新启动运行(main方法启动),所以generator()在每次启动获得的值不同,所以不一样

------解决方案--------------------
探讨

因为
public static final int randomPort1= generator();
这个是常量,对于Test3来说只调用一次generator(); randomPort1不再改变,所以两次是一样的
对于Test2来说,每次都回重新启动运行(main方法启动),所以generator()在每次启动获得的值不同,所以不一样

------解决方案--------------------
第一 Test2和Test3里面CharacterUtil对generator()都只调用了一次

JAVA面向对象的特性,static{ }声明的函数,优先执行权比构造块和构造函数都高,它作用主要就是
如果内中有静态的属性,就使用静态块初始化。不管类实例化几次,静态块中代码只执行一次,所以Test3返回的两个值是一样的、楼主可以debug试试、

第二 Test2和Test3的值不同是正常的,因为Random()是个随机类!
------解决方案--------------------
看到很多人回复说是因为randomPort1是常量的问题,在此指出下。这里出现相同的跟是否是final生命的没有任何关系,大家可以试试把final去掉,得到的结果还是一样的。这里是static机制引起的、、

当然如果把static去掉,然后声明成常量,得到的结果才是final引起的原因、
------解决方案--------------------
很明显,你运行的时候启动了两次jvm,到处了两中不同的结果。因为static修饰的变量是类变量,它在class加载进jvm的时候会生成,因为运行了两次JVM,导致class文件加载了两次,因此其结果不相同。
基本可以理解,这种运行方式就如同在两台电脑上分别运行Test2与Test3,导致两次运行的结果不一直。
如果可能,请将Test3与Test2的main方法写在一起运行,就会发现其结果完全一下。