问题描述
一个类,其中行号为了方便说明加上去了classAnima{1privatestringname="";2publicAnima(stringname)3{4this.name=name;5}}实例化一个类:Animaan=newAnima("a")//按F9请在这里下断点按F5运行,按F11,程序运行到第1句:这时privatestringname="a"(正常情况应该是name=null,字段在没有赋值时默认为null);按F11程序运行到第2句:这时privatestringname="a"(正常情况应该是name="");按F11->第3句按F11->第4句,给这privatestringname赋值为a(正常情况name="a");最后为了印证一下在字段与构造方法中参数名称不一致时的情况是否会发生上面的问题,修改了一下再调试观察,不再出现上面的问题,请大家说说看是什么原因classAnima{1privatestringname="";2publicAnima(stringName)3{4this.name=Name;5}}
解决方案
解决方案二:
你说的顺序,不对。。
解决方案三:
引用1楼c863123的回复:
你说的顺序,不对。。
你测试一下嘛,看看就知道了啦,我是VS2008
解决方案四:
在执行newAnima("a")这句时,首先查找是否有相应的构造函数。发现有,把"a"赋值给name,所以第一行name="a".在进入构造函数时,发现name与this.name不同,就把""赋值给this.name.完毕执行赋值。
解决方案五:
不要太相信你看到的了这个估计是08智能感知的BUG他感知到的是name而不是this.name也就是在构造里只要感知到name显示的就是a其实没有错误而是显示错了你分别追踪下name与this.name就知道了
解决方案六:
引用3楼tysyjsj的回复:
在执行newAnima("a")这句时,首先查找是否有相应的构造函数。发现有,把"a"赋值给name,所以第一行name="a".在进入构造函数时,发现name与this.name不同,就把""赋值给this.name.完毕执行赋值。
不,我在调试研究观察中,如果字段有赋值行为时,是先检测有赋值行为字段,再进入构造函数,在字段没有赋值行为时,才是直接进行构造函数最后我根据多种代码修改测试调试后,得出,一个类初始化时应该是先进行字段检测与赋值再进入构造函数(因为当字段有赋值行为时,当调试为逐行时会先到这里)
解决方案七:
第1句:正常情况应该是name=null
解决方案八:
引用4楼cancerser的回复:
不要太相信你看到的了这个估计是08智能感知的BUG他感知到的是name而不是this.name也就是在构造里只要感知到name显示的就是a其实没有错误而是显示错了你分别追踪下name与this.name就知道了
在监视窗口也看了一下,name="a"这个问题一样存在;看样子,感觉调试器在处理这方面的问题时,有可能是如果在字段与构造函数中如果有同名的(调试器分不清究竟是那个变量,好象是对作用域没有分清一样),在调试器中处理为相同的值,不知这可不可以算做是一个小小的BUG
解决方案九:
name的确是=a啊你要清楚的是你要看的是两个变量name与this.name他们可是不同的东西
解决方案十:
引用8楼cancerser的回复:
name的确是=a啊你要清楚的是你要看的是两个变量name与this.name他们可是不同的东西
是的,我说的是privatestringname中name的值在调试器中的情况,也是我今天无意中发现的,我用的是vs2008,我也做了几个实验,实验内容就是把字段名与构造函数的参数名称写成同名,再调试器中用智能感知或监视窗口中观察出现这样的有趣的问题,这可能是一个小BUG吧privatestringname;privateintage=29;publicAnima(stringname,stringage){}
解决方案十一:
哇,又开一帖,看来楼主不死心。1.string是一个引用类型2.你也发现如果参数是用Name的话一切符合逻辑3.由于字段name与参数name所指地址相同,你看到的其实是参数name的值,你可以这样试一下:publicclassAnima{stringname="";publicAmina(stringname){this.name="b";}}
断点来stringname="";时,看到name是等于"a"的。