黑马程序员技术交流社区
标题:
初始化问题
[打印本页]
作者:
天下
时间:
2013-10-30 16:58
标题:
初始化问题
本帖最后由 天下 于 2013-10-31 08:11 编辑
public class Test1 {
{
a = 1;
System.out.println(a);//这里会抛错。
}
private int a;
public static void main(String[] args){
Test1 test1 = new Test1();
System.out.println(test1.a);
}
}
--------------------------------------------------------
报错
public class Test6 {
{
a = 4;
}
private static final int a;
public static void main(String[] args){
System.out.println(a);
}
}
--------------------------------------------------------
这个又没有问题
public class Test7 {
static{
a = 5;
}
private static final int a;
public static void main(String[] args){
System.out.println(a);
}
}
=========================一下子,变量初始化把我搞晕了,test1和test6为什么报错,test7为什么又没有问题????
复制代码
作者:
王飚
时间:
2013-10-30 18:45
/*
问题在于构造代码块、静态代码块和对象的加载顺序,
并且要明确构造代码块只有对象存在时才会执行:
对于Test1:构造代码块是给对象进行初始化,运行时,
对象中的成员变量private int a根本还没有进内存;
所以楼主可以用我修改过的方法来验证:
对于Test6: 若变量一被声明为final,则它的值就不可再改变,
并且,楼主要注意的是:构造代码块只有存在对象时才执行,并且,
静态变量先于对象存在于一个单独的静态区中,所以,楼主可以用我在以下
修改的方法中进行验证:
对于Test7:是因为静态成员变量int a先于对象存在于静态区中,静态代码块:
static{}也先于对象存在,并是给主函数进行初始化,所以,可以执行正确,
但是,若是将a声明为final则同样会报错;
如下注释:
*/
class Test1 {
//先运行构造代码块(因为主函数中创建了对象),此时,对象中的成员变量private int a还未加载;
{ int a;//给a指定数据类型
a = 1;
System.out.println(a);
}
private int a;//-->这里运行后是0;
public static void main(String[] args)
{
Test1 test1 = new Test1();
System.out.println(test1.a);
}
}
--------------------------------------------------------
class Test6 {
{ //静态代码块执行之前,静态区中已经存在静态变量a
a = 4;
System.out.println("test:"+a);
}
private static /*final*/ int a=3;//若变量一被声明为final则不可再改变;
public static void main(String[] args)
{
System.out.println("hh"+new Test6().a);
}
}
--------------------------------------------------------
class Test7 {
static{
a = 5;
}
private static final int a;
/*如果这里指定了a的值,如private Static final int a=9;
那么就会出错因为final变量的值不可再改变
*/
public static void main(String[] args)
{
System.out.println(a);
}
}
复制代码
作者:
孙涛00
时间:
2013-10-30 19:35
给你看一个例子
class StaticCode
{
StaticCode()
{
System.out.println("a");
}
static//静态代码块,用于给类初始化
{
System.out.println("b");
}
{//构造代码块,给对象初值化
System.out.println("c");
}
StaticCode(int x)
{
System.out.println("d");
}
public static void main(String[] args)
{
new StaticCode(4);
}
}
复制代码
打印结果:
b
c
d
作者:
天下
时间:
2013-10-31 08:10
貌似里清了顺序,感谢大家
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2