黑马程序员技术交流社区

标题: 为什么执行结果不一样呢??? [打印本页]

作者: 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