黑马程序员技术交流社区
标题:
为什么执行结果不一样呢???
[打印本页]
作者:
HM汪磊
时间:
2013-3-1 18:44
标题:
为什么执行结果不一样呢???
第一个程序:
class Person
{
private String name;
private int age;
Person(String name)
{
name=name;
System.out.println("name="+name+",,age="+age);
}
// public void speak()
//{
// }
}
class Half
{
public static void main(String[] args)
{
Person p=new Person("wangwu");
//p.speak();
}
}
执行结果为:name=wangwu,,age=0
第二段程序:
class Person
{
private String name;
private int age;
Person(String name)
{
name=name;
}
public void speak()
{
System.out.println("name="+name+",,age="+age);
}
}
class Half
{
public static void main(String[] args)
{
Person p=new Person("wangwu");
p.speak();
}
}
执行结果:name=null,,age=0
为什么两段程序结果中name打印结果不同呢??????
作者:
孙娜
时间:
2013-3-1 18:53
第一个程序里面输出的name是对象里面的name,已经被赋值为wangwu;第二个程序里面的name是类里面的成员变量,成员变量没有被赋值,所以为空,输出就是null
作者:
夏晓彤
时间:
2013-3-1 18:59
不一样
一里面 Person(String name)
{
name=name;
System.out.println("name="+name+",,age="+age);这里面的name打印出来的是你new Person("wangwu"); 传进去的,但是不是 private String name;中的name,
第二段里面 Person(String name)
{
name=name;
}方法毫无意义,应该这么写this.name=name;当你创建对象时,才能把参数传给 Person的变量name。。所以第二段的name值是null
作者:
孙娜
时间:
2013-3-1 19:45
又回去复习了一下,第二个程序里面的name不是类里面的成员变量,是p所指对象中的name。楼上说的非常正确,谢谢你们提出和回答这个问题,让我找到了一个我理解错误的地方
作者:
罗海云
时间:
2013-3-1 20:12
先来说说你的第一段吧..
private String name;
private int age;
Person(String name)
{
name=name;//
这儿,,相当于你把传进来的值付给传进来的值, 以后建议你写代码,,这儿标识一下.this.name = name; 打印的也是你传进来的name..所以会出现wangwu//
System.out.println("name="+name+",,age="+age);
}
在来说说你的第二段代码
Person(String name)
{
name=name;//
这儿跟上面的原因一样.
}
public void speak()
{
System.out.println("name="+name+",,age="+age);
这儿打印就是打印你这个类中的成员变量, 因为你前面赋值没有成功所以才是null...
}
这是我的解释,文笔不好请见谅
作者:
克零岚
时间:
2013-3-1 21:07
这是楼主的第一段代码:
public class Person {
private String name;
private int age;
public Person(String name)
{
name=name;
System.out.println("name="+name+",,age="+age); //这个地方输出的是构造方法里的参数name变量值,因为当函数外部定义了全局变量,函数内部定义了同名同类型的局
} //部变量时,程序会优先引用函数内部的(逻辑距离最近)变量。
public static void main(String[] args) {
Person p=new Person("wangwu");
}
}
这是楼主的第二段代码:
public class Person {
private String name;
private int age;
public Person(String name)
{
name=name; //你的目的是把参数赋值给类的局部变量name,此时你定义的参数与类的局部变量同名啦,这时发生了很有趣的事情:两个name都表示的是参数变量name(因为
} //当函数外部定义了全局变量,函数内部定义了同名同类型的局部变量时,程序会优先引用函数内部的(逻辑距离最近)变量),因此你要输出并没有赋值的类全局变
public void speak() //量时,结果当然是null了;解决办法为:使用this关键字,即this.name=name,this关键字的作用是:可以作为当前类的对象调用当前类的成员,所以
{ //this.name表示的是类的全局变量name,即可以完成把参数name赋值给类的局部变量name了
System.out.println("name="+name+",,age="+age);
}
public static void main(String[] args) {
Person p=new Person("wangwu");
p.speak();
}
}
说的明明白白,清清楚楚,希望楼主可以看到,并且忠告一下楼主,变量命名最好不要相同,这样容易混淆,程序的可读性很重要的!
版主迫切求分中。。。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2