在实例化对象时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
展开
 我来答
  • 你的回答被采纳后将获得:
  • 系统奖励15(财富值+成长值)+难题奖励20(财富值+成长值)
若以下回答无法解决问题,邀请你更新回答
microroom
科技发烧友

2018-08-28 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:7118
采纳率:83%
帮助的人:1627万
展开全部
//举例说明
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?

这个问题已经在举例说明中回答过了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式