A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 青衫禅客 于 2014-12-26 01:06 编辑

如题……

QQ截图20141226010540.png (132.02 KB, 下载次数: 14)

QQ截图20141226010540.png

评分

参与人数 1黑马币 +4 收起 理由
黑马-李权88 + 4 赞一个!

查看全部评分

29 个回复

倒序浏览
输出的是什么,完全看不清……
回复 使用道具 举报
你放那两个地方结果都是一样的,都是在成员位置那里,也就是你放的两个位置都是成员变量,
回复 使用道具 举报
qowoeo7538 发表于 2014-12-25 23:13
输出的是什么,完全看不清……

我重新发了一下图,请帮忙看看
回复 使用道具 举报
吴海松 发表于 2014-12-26 00:45
你放那两个地方结果都是一样的,都是在成员位置那里,也就是你放的两个位置都是成员变量, ...

我重新发了一下图,请帮忙看看,就是两个地方结果不一样,我才问发论坛问大家的
回复 使用道具 举报
你符值都不一样肯定是不一样啊,第一个赋值时38结果是38,第二个赋值是10结果是10,这是正常的啊,
回复 使用道具 举报
duluhua 中级黑马 2014-12-26 14:06:28
7#
我运行试了,int i 放到构造代码块的上下,打印的值是不一样的,想不明白为什么,坐等大神。
回复 使用道具 举报
吴海松 发表于 2014-12-26 11:31
你符值都不一样肯定是不一样啊,第一个赋值时38结果是38,第二个赋值是10结果是10,这是正常的啊, ...

能详细解释一下吗?
回复 使用道具 举报
李票 中级黑马 2014-12-26 23:32:53
9#
本帖最后由 李票 于 2014-12-26 23:35 编辑

因为构造代码块要比对象优先先要执行,而且代码都是是从上往下执行的,当 i =10在上面时,在构造代码块中i=38将i=10覆盖,打印的都是38。当i=10在下面时,先执行代码块,代码块中的代码执行完后打印后,又将i=10将i=38覆盖了,new过对象调用后打印的是i=10。我说下代码的执行顺序,静态代码快最先执行并且只执行一次,在执行构造代码块,其次是执行构造方法,然后是对象中的函数
回复 使用道具 举报
李票 中级黑马 2014-12-26 23:34:39
10#
李票 发表于 2014-12-26 23:32
因为构造代码块要比对象优先先要执行,而且代码都是是从上往下执行的,当 i =10在上面时,在构造代码块中i= ...

说反了。i=10在下面时是将i=38覆盖了:)
回复 使用道具 举报
以下是我个人的理解:
1、i在代码块的前面时,
        当你进行A x=new A()创建对象后,因为是执行的默认的构造方法(默认的不显示),执行完构造方法后,就是按顺序执行流程了,所亿,
        i=20;
        1=38
        this.i=38;
        wahaha
        当这些执行完毕后,开始执行你main中new后面的语句println(x.i)

        这个你看有什么问题吗?如果有不同见解,欢迎指教!

2、i在代码块后面时
        抱歉,这个我也不是太懂,不过记得类中的执行顺序是,
        静态代码块----构造代码块——构造方法,
        看有没有大神解答了

       
回复 使用道具 举报
赵涛涛 发表于 2014-12-26 23:37
以下是我个人的理解:
1、i在代码块的前面时,
        当你进行A x=new A()创建对象后,因为是执行的默认的构造方 ...

我的老师说的是先默认初始化,然后从上到下显示初始化,在过程中有构造代码块就执行,没有就算了,最后执行构造函数,但关键当我构造代码块中有一个this.i的时候又是怎么个情况,我老师也还没给我回复呢?
回复 使用道具 举报
李票 发表于 2014-12-26 23:32
因为构造代码块要比对象优先先要执行,而且代码都是是从上往下执行的,当 i =10在上面时,在构造代码块中i= ...

我的老师说的是先默认初始化,然后从上到下进行显示初始化,在这过程中有构造代码块就执行,没有就算了,最后执行构造函数,但关键当我构造代码块中有一个this.i的时候又是怎么个情况,注意有this的情况和没有this的情况不一样的哦,当int i在下面的时候,没有this会编译报错
回复 使用道具 举报
青衫禅客 发表于 2014-12-27 00:32
我的老师说的是先默认初始化,然后从上到下进行显示初始化,在这过程中有构造代码块就执行,没有就算了, ...

老师回复你后,希望把答案贴上来,我也想看看,谢谢啦
回复 使用道具 举报
因为类刚加载进内存的时候成员变量有个默认初始化值  那个i=0;就是成员变量还没有运行完  然后会从上到下一行一行的去执行代码,如果没有没this.的时候 运行到i=38时  成员变量i还没有完全创建成功   当调用i的时候会报错。
有this.的时候会到构造代码块外面去找 。这个时候找到的i=0,所以先把38赋值给i,读到下面的时候又把10赋值给i
所以后面的运行结果是10。
第一种情况很好解释了 就是一行一行的读代码。
回复 使用道具 举报 1 0
Alexrl 来自手机 中级黑马 2014-12-28 17:42:59
16#
是不是先把类的成员加载完了再执行  加载和执行顺序的原因。
回复 使用道具 举报
zmhlnrs 发表于 2014-12-28 17:26
因为类刚加载进内存的时候成员变量有个默认初始化值  那个i=0;就是成员变量还没有运行完  然后会从上到下 ...

当没有this的时候,运行到i=38时,成员变量是已经成功默认初始化的啊,那么就应该可以调用吧?!
回复 使用道具 举报
我试了下,确实像楼主说的那样:一般赋值语句和构造代码块的顺序改变了,结果会有变化。我觉得现在的问题是一般的赋值语句和构造代码块的执行顺序是否固定?还是按照从上到下的顺序执行?我也想知道这个答案!
回复 使用道具 举报
和构造函数中的this()super()一个道理放在首行,因为初始化的动作要先执行这样才会避免覆盖同名值, 构造代码块和静态代码块都是做初始化动作的所以前面的会被覆盖,
回复 使用道具 举报
都是黑马币啊
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马