[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中的结果不一样,请问类之间的调用关系是什么样的?内部的执行是怎样的?求高手指教!

解决方案 »

  1.   

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

  2.   

    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的属性。
      

  3.   

    public static final int randomPort1= generator();
    这句话表明randomPort1是个常量,所以Test3中的两个数都是一样。
    但是Test2与Test3你是分两次执行的,所以当然随机生成的常量也都是不一样的撒。
      

  4.   


    radnomPort1 为常量,只有CharacterUtil类第一次调用会发生改变。
      

  5.   

    第一 Test2和Test3里面CharacterUtil对generator()都只调用了一次JAVA面向对象的特性,static{ }声明的函数,优先执行权比构造块和构造函数都高,它作用主要就是
    如果内中有静态的属性,就使用静态块初始化。不管类实例化几次,静态块中代码只执行一次,所以Test3返回的两个值是一样的、楼主可以debug试试、第二 Test2和Test3的值不同是正常的,因为Random()是个随机类!
      

  6.   

    看到很多人回复说是因为randomPort1是常量的问题,在此指出下。这里出现相同的跟是否是final生命的没有任何关系,大家可以试试把final去掉,得到的结果还是一样的。这里是static机制引起的、、当然如果把static去掉,然后声明成常量,得到的结果才是final引起的原因、
      

  7.   

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

  8.   

    真的很感谢大家的回复,但是如果CharacterUtil类内的改成public static int randomPort1 =generate();就是把fianl去掉,仍然是这样的结果!六楼和八楼的回复很是给力,多谢你们了