为什么可以输出赋值语句?

NeColor 2016-08-10 10:01:17


public class ExecutionSque {

/**
* static变量,成员变量,构造方法,static代码块,构造代码块
*/

{
a=11;
System.out.println("构造快"+(a=12));
}
int a;
public static void main(String[] args) {
// TODO Auto-generated method stub
new ExecutionSque();

}

}

System.out.println("构造快"+(a=12)); 这样可以输出
但是System.out.println("构造快"+a);却不行了

...全文
225 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
soton_dolphin 2016-08-10
  • 打赏
  • 举报
回复
因为这个实例变量a在类被载入的时候会被抄到构造器里面,而初始化块先于构造器执行,所以在初始化块执行的时候a并没有被赋于默认值值,就会出错。
nikyotensai 2016-08-10
  • 打赏
  • 举报
回复
System.out.println("构造快"+12)这个也行呀。 System.out.println的时候a还没有,你使用赋值,它会去找,System.out.println(a)也不行呀
狂暴的小猴儿 2016-08-10
  • 打赏
  • 举报
回复
我觉得和jvm的编译期的变量处理有关系 a是个变量 a=12 是个固定值的常量 具体不晓得 我也想知道原理 帮你顶一下
NeColor 2016-08-10
  • 打赏
  • 举报
回复
引用 1 楼 wlwlwlwl015 的回复:
你把a的声明放上面就好了:
  /**
     * static变量,成员变量,构造方法,static代码块,构造代码块
     */
	 int a;
    {
        a=11;
        System.out.println("构造快"+a);
    }
    
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Test08();
 
    }
我知道可以这么做,我问的是写a和写a=12这两者之间有什么区别
小灯光环 2016-08-10
  • 打赏
  • 举报
回复
你把a的声明放上面就好了:
  /**
     * static变量,成员变量,构造方法,static代码块,构造代码块
     */
	 int a;
    {
        a=11;
        System.out.println("构造快"+a);
    }
    
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Test08();
 
    }
NewMoons 2016-08-10
  • 打赏
  • 举报
回复
楼主问的这个问题还藏的还真有点深,猛一看还真觉得是bug。不过。。。看下面代码 自己看代码里的注释把,我就不再解释了。
public class ExecutionSque {
	{
		String str;
		str = "构造快" + a;//Cannot reference a field before it is defined 你还没有初始化这个变量无法操作!
		str = "构造快" + c;//c cannot be resolved to a variable 你没定义这个变量,我用不了!
		str = "构造快" + this.a;//这句没报错,为什么呢?因为this.a把a初始化为0了。
		System.out.println(str);
	}
	int a;

	public static void main(String[] args) {
		new ExecutionSque();
	}
}
soton_dolphin 2016-08-10
  • 打赏
  • 举报
回复
引用 6 楼 monkeyqqqq 的回复:
[quote=引用 5 楼 soton_dolphin 的回复:] 因为这个实例变量a在类被载入的时候会被抄到构造器里面,而初始化块先于构造器执行,所以在初始化块执行的时候a并没有被赋于默认值值,就会出错。
为什么a=11 赋值语句不会报错[/quote] 你已经给a赋值了,当然不会报错。。
狂暴的小猴儿 2016-08-10
  • 打赏
  • 举报
回复
引用 5 楼 soton_dolphin 的回复:
因为这个实例变量a在类被载入的时候会被抄到构造器里面,而初始化块先于构造器执行,所以在初始化块执行的时候a并没有被赋于默认值值,就会出错。
为什么a=11 赋值语句不会报错

62,626

社区成员

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

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