黑马程序员技术交流社区

标题: Static{ } 方法的加载问题 [打印本页]

作者: 黑马_许芸    时间: 2012-9-6 10:36
标题: Static{ } 方法的加载问题
本帖最后由 黑马_许芸 于 2012-9-6 13:17 编辑

为什么在下面的程序中 只是加了一个final    ,输出的结果只是 2 了呢?  与没有加final有什么区别呢?请高手指点

class FinalTest
{
public static final int x = 6 / 3;           如果改成    public static int x=2;为什么输出结果是:FinalTest static block
                                                                                                                                   2

static
{
  System.out.println("FinalTest static block");
}
public static void aaa()
{
}
}
public class Test2
{
public static void main(String[] args)
{
  //访问某个类或接口的静态变量
  System.out.println(FinalTest.x);
}
}

作者: 彭润生    时间: 2012-9-6 11:01
楼上说的很对,你已加个final就成了常量。直接就进入常量池了。可以直接用,不用通过类。去掉就要加载这个类。
作者: 武庆东    时间: 2012-9-6 11:21

为什么在下面的程序中 只是加了一个final    ,输出的结果只是 2 了呢?  与没有加final有什么区别呢?请高手指点

class FinalTest
{
public static final int x = 6 / 3;         /*添加final,编程静态常量,添加到常量池中,不用通过类就可以直接使用!否则,先对类进行初始化,执行静态代码块所以,静态代码块在程序初始化时自动产生*/
                                                                                                                       

static
{
  System.out.println("FinalTest static block");
}
public static void aaa()
{
}
}
public class Test2
{
public static void main(String[] args)
{
  //访问某个类或接口的静态变量
  System.out.println(FinalTest.x);
}
}
静态代码块总结:
1.静态代码快,只能定义在类里面,它独立于任何方法,不能定义在方法里面
2.静态代码块里面的变量都是局部变量,只能在本块中有效
3.静态代码块会在类被加载时自动执行,无论加载着是jvm还是其他类
4.一个类总允许定义多个静态代码块,执行的顺序根据定义的顺序进行


作者: Tesla时光    时间: 2012-9-6 11:56
本帖最后由 翁发达 于 2012-9-6 12:16 编辑

因为被final修饰且已赋值的是常量,且其存在于FinalTest类中,而主方法存在于Test2中,主方法初始化完后执行主程序,直接在常量区把x找到直接运行,不用再初始化类FinalTest了
如图:


最后作一个补充,上面情况成立是因为你把主方法定义到了一个新类中,千万注意一种情况:如果主函数也在FinalTest类里,那么情况就完全不同了,这个时候加不加final,打印结果都是一样,虽要先执行静态代码块.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2