请教关于初始化块的问题

Strive_penniless 2017-03-24 10:59:40

public class question
{
public int e;
{
int a = 5;
//这是一个初始化块,为什么会输出找不到符号a,去掉中括号又可以呢
} //如果去掉括号,相当于声明了一个带default修饰符的成员变量a
public question()
{

this.e = a; //编译执行到这一步,提示找不到符号a
}
public static void main(String[] args)
{

System.out.println(new question().e);

}
}
...全文
135 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbjiabcd 2017-03-24
  • 打赏
  • 举报
回复

    {
    int a = 5;
    }
加上大括号则a的定义只在大括号内有效,去掉大括号代表a在整个类中有效
s593360340 2017-03-24
  • 打赏
  • 举报
回复
public class Question{ public int e; public int a; { a = 5; //这是一个初始化块,为什么会输出找不到符号a,去掉中括号又可以呢 } //如果去掉括号,相当于声明了一个带default修饰符的成员变量a public Question(){ this.e = a; //编译执行到这一步,提示找不到符号a } public static void main(String[] args){ System.out.println(new Question().e); } } 局部变量和全局变量的定义,你没有搞清楚吧。 不知道是不是叫这个名字 还是成员变量啥的。 变量的作用域这块的知识
zs808 2017-03-24
  • 打赏
  • 举报
回复
哈哈,不得不说,lz看问题挺“刁钻”的哈~ 首先,我认为初始化块出现的目的就是:减少构造函数的体积,使代码逻辑更加清晰,同时更容易阅读 这个问题,其实也是挺有意思的,因为在java里,类的默认初始化操作可以指甲在方法体外加初始化块,然后里面加初始化代码进行初始化,而这些初始化操作的字节码又会被嵌入到其它的构造函数中。这就很容易给人造成一个误解,就是初始化块内的局部变量作用域,会扩大到所有的构造函数中。按照道理来说,这么设计确实有一定的道理,但是呀,目前的java编译器是不认可这种说法的。 因为,你的代码块的位置有可能是任意的,比如以下这个写法:
	public class question {
		public int e;
		{
			int a = b;
			// 这是一个初始化块,为什么会输出找不到符号a,去掉中括号又可以呢
		} // 如果去掉括号,相当于声明了一个带default修饰符的成员变量a

		public question() {
			this.e = a; // 编译执行到这一步,提示找不到符号a
		}
		{
			int b = c;
		}
		{
			int c = a;
		}
	}
就会让人举觉得很混乱,把变量的作用域搞得乱七八糟,而且,很有可能出现问题。 所以呀,个人认为,对于初始化块的正确使用方式是:通过在一个类局部变量或静态变量下面加入初始化或静态初始化代码块,对该变量进行单独的初始化(并且不要依赖于该类的任何属性)。 而且,不要重度使用初始化块,因为这样会破坏代码的结构,不利于维护。 以上只是个人见解,如果有什么不同的意见,欢迎提出,一起讨论~

62,621

社区成员

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

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