黑马程序员技术交流社区
标题:
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了
如图:
QQ五笔截图未命名.png
(20.75 KB, 下载次数: 14)
下载附件
2012-9-6 11:56 上传
最后作一个补充,上面情况成立是因为你把主方法定义到了一个新类中,
千万注意一种情况:如果主函数也在FinalTest类里,那么情况就完全不同了,这个时候加不加final,打印结果都是一样,虽要先执行静态代码块.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2