类的初始化

PJ_Richard 2016-04-17 09:45:04
类的生命周期:装载->校验->准备->解析->初始化->使用->卸载

在准备阶段:给静态成员变量分配内存和默认初始化值,那么下面的代码中,a=0;
那么在执行静态代码块时,为什么不能输出a=0
静态代码块不是在初始化阶段运行吗?

public class Draft{
public static void main(String[]args){
System.out.println("主函数");
}
static Draft d=new Draft();
static{
System.out.println("a="+a);
}
static int a=99;
}
...全文
139 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
PJ_Richard 2016-04-18
  • 打赏
  • 举报
回复
引用 8 楼 Max_张红帅的回复:
这不一样。 静态代码块和静态语句是同一级别的,相当于在一个方法的内部,变量必须在使用前声明。 方法(无论是否是静态的)比静态代码块和静态语句低一级:可以在类的任何地方定义你想要定义的成员变量,可以再方法中使用在方法之后定义的成员变量。 只记得是这样的,至于为什么,我猜应该是编译顺序不同,静态代码块和静态语句是先语义分析,然后再类的其他部分的语义分析
嗯嗯,谢谢了,回头我看看编译都是怎么编译的
Max_张红帅 2016-04-17
  • 打赏
  • 举报
回复
这不一样。 静态代码块和静态语句是同一级别的,相当于在一个方法的内部,变量必须在使用前声明。 方法(无论是否是静态的)比静态代码块和静态语句低一级:可以在类的任何地方定义你想要定义的成员变量,可以再方法中使用在方法之后定义的成员变量。 只记得是这样的,至于为什么,我猜应该是编译顺序不同,静态代码块和静态语句是先语义分析,然后再类的其他部分的语义分析
PJ_Richard 2016-04-17
  • 打赏
  • 举报
回复
引用 6 楼 u013165504 的回复:
这两个不一样啊,第一个是在静态代码块中使用静态变量,同一个级别的,顺序编译,你现在给的这个是在方法中调用静态变量
那么这个又是怎么调用到的呢?这个不也是未声明吗?
Max_张红帅 2016-04-17
  • 打赏
  • 举报
回复
这两个不一样啊,第一个是在静态代码块中使用静态变量,同一个级别的,顺序编译,你现在给的这个是在方法中调用静态变量
PJ_Richard 2016-04-17
  • 打赏
  • 举报
回复
引用 4 楼 u013165504 的回复:
感觉你有点学晕了,是,的确是这样的,但是变量使用之前得先声明啊亲,不然怎么通过编译。 想要验证你说的,可以这么改: static int a; static{ System.out.println("a="+a); }
你看看这个:这个变量是在最后声明的。 public class Draft{ public static void main(String[]args){ System.out.println("主函数"); } static Draft d=new Draft(); Draft(){ System.out.println("a="+a); } static{ System.out.println("静态代码块执行"); } static int a=10; } 结果: a=0 静态代码块执行 主函数
Max_张红帅 2016-04-17
  • 打赏
  • 举报
回复
感觉你有点学晕了,是,的确是这样的,但是变量使用之前得先声明啊亲,不然怎么通过编译。 想要验证你说的,可以这么改: static int a; static{ System.out.println("a="+a); }
PJ_Richard 2016-04-17
  • 打赏
  • 举报
回复
引用 1 楼 u013165504 的回复:
代码有问题吧。 static int a = 99; static{ System.out.println("a="+a); } 不是这个顺序,编译都不会通过吧
我之前看到一个帖子: public class Draft{ public static void main(String[]args){ System.out.println("主函数"); } static Draft d=new Draft(); Draft(){ System.out.println("a="+a); } static{ System.out.println("静态代码块执行"); } static int a=10; } 结果: a=0 静态代码块执行 主函数 这说明在执行静态代码块之前,a=0已经存在了
PJ_Richard 2016-04-17
  • 打赏
  • 举报
回复
引用 1 楼 u013165504 的回复:
代码有问题吧。 static int a = 99; static{ System.out.println("a="+a); } 不是这个顺序,编译都不会通过吧
结果来看是这样。 不过我在看类的生命周期时(我题中所说的周期),其中,类的准备阶段:静态成员变量分配内存并默认初始化。 所以当执行静态代码块时,a不是已经存在并a=0了吗?
Max_张红帅 2016-04-17
  • 打赏
  • 举报
回复
代码有问题吧。 static int a = 99; static{ System.out.println("a="+a); } 不是这个顺序,编译都不会通过吧

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧