在实例化对象时java是会先声明类属性再按照顺序赋值吗
publicclassInstanceInitTest{{a=6;}inta=9;publicstaticvoidmain(String[]args){System.ou...
public class InstanceInitTest{
{
a = 6;
}
int a = 9;
public static void main(String[] args)
{
System.out.println(new InstanceInitTest().a);
}}
为何初始化块里的a可以不用数据类型声明
而且最终值为9 展开
{
a = 6;
}
int a = 9;
public static void main(String[] args)
{
System.out.println(new InstanceInitTest().a);
}}
为何初始化块里的a可以不用数据类型声明
而且最终值为9 展开
- 你的回答被采纳后将获得:
- 系统奖励15(财富值+成长值)+难题奖励20(财富值+成长值)
若以下回答无法解决问题,邀请你更新回答
展开全部
//举例说明
public class P {
{
//1、输出a=0
System.out.println("a="+this.a);
a=6;
//2、输出a=6
System.out.println("a="+this.a);
}
int a=9;
public static void main(String[] args) {
//3、输出a=9
System.out.println("a="+new P().a);
}
}
/*为什么是按1、2、3的顺序输出?
分析:
首先,new P().a中的new会分配内存,并将a初始化为默认值0(即用0填充分配的内存),所以先输出1;
其次,字段的赋值与初始化块的执行是按顺序执行的(谁在前就先执行谁),所以先执行初始化块中的a=6;后执行int a=9;中的赋值操作,最后a的值是9。
*/
public class P {
{
//1、输出a=0
System.out.println("a="+this.a);
a=6;
//2、输出a=6
System.out.println("a="+this.a);
}
int a=9;
public static void main(String[] args) {
//3、输出a=9
System.out.println("a="+new P().a);
}
}
/*为什么是按1、2、3的顺序输出?
分析:
首先,new P().a中的new会分配内存,并将a初始化为默认值0(即用0填充分配的内存),所以先输出1;
其次,字段的赋值与初始化块的执行是按顺序执行的(谁在前就先执行谁),所以先执行初始化块中的a=6;后执行int a=9;中的赋值操作,最后a的值是9。
*/
追问
那意思是在实例化对象的时候会先将类里的变量进行声明类型吗,就是搞不懂为什么初始化块里没有用int声明
追答
问题一:实例化对象的时候都干了些什么呢?
1、看到了类里的变量声明的是什么类型,好依据类型来为变量分配内存。而声明(什么叫声明?不就是为变量指定类型吗!)是由写代码的人(程序员)指定的,比如,一个声明为int类型的变量,在实例化对象时,会为其分配4字节的内存。即实例化对象不但不负责声明,相反,它还要利用声明来为对象分配内存,声明从来都是程序员的事。
2、调用由程序员指定的构造函数。
3、其它乱七八糟的事情(这里就不说了)。
问题二:初始化块与声明是什么关系?
1、可以在初始化块中声明变量,但声明的是局部变量,只能在初始化块中使用。
2、在初始化块中可以直接访问类中声明的变量。这就是为什么能在初始化块里为a赋值,而不需要声明的原因。因为它已经在类中声明过了,如果再在初始化块中声明一个a,就会造成局部变量a覆盖类中声明的变量a,继而产生一些其它影响(这里就不说了,有兴趣的话,自己查资料)。
问题三:为什么a的最终值为9?
这个问题已经在举例说明中回答过了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询