A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马_许芸 中级黑马   /  2012-9-6 10:36  /  1456 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马_许芸 于 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);
}
}

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
楼上说的很对,你已加个final就成了常量。直接就进入常量池了。可以直接用,不用通过类。去掉就要加载这个类。
回复 使用道具 举报

为什么在下面的程序中 只是加了一个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.一个类总允许定义多个静态代码块,执行的顺序根据定义的顺序进行

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 翁发达 于 2012-9-6 12:16 编辑

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


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

点评

解释的很好,学习了~  发表于 2012-9-6 17:06

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 图文并茂

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马