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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM汪磊 高级黑马   /  2013-3-1 18:44  /  1484 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

第一个程序:
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打印结果不同呢??????



评分

参与人数 1技术分 +1 收起 理由
张庚 + 1

查看全部评分

5 个回复

倒序浏览
第一个程序里面输出的name是对象里面的name,已经被赋值为wangwu;第二个程序里面的name是类里面的成员变量,成员变量没有被赋值,所以为空,输出就是null

点评

鼓励一下~  发表于 2013-3-7 12:48

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
不一样
一里面    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

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
又回去复习了一下,第二个程序里面的name不是类里面的成员变量,是p所指对象中的name。楼上说的非常正确,谢谢你们提出和回答这个问题,让我找到了一个我理解错误的地方
回复 使用道具 举报
先来说说你的第一段吧..
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...         }
这是我的解释,文笔不好请见谅
回复 使用道具 举报
这是楼主的第一段代码:
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();
}
}

说的明明白白,清清楚楚,希望楼主可以看到,并且忠告一下楼主,变量命名最好不要相同,这样容易混淆,程序的可读性很重要的!

版主迫切求分中。。。。。。

点评

很详细,谢谢,  发表于 2013-3-1 22:52

评分

参与人数 1技术分 +1 收起 理由
张庚 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马