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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩新凯 中级黑马   /  2012-4-18 21:58  /  1746 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 韩新凯 于 2012-4-19 08:08 编辑

class PersonDemo {
        private String name;
        private int age;

        public PersonDemo(String name, int age) {
                name = name;
                age = age;
        }

        public void speak() {
                System.out.println("name=" + name + "---" + "age=" + age);
        }
}

public class Haha {
        public static void main(String[] args) {
                PersonDemo pd = new PersonDemo("haha", 111);
                pd.speak();
        }

}
输出结果为什么是name=null---age=0,为什么没有赋值成功?

8 个回复

倒序浏览
在PersonDemo 类中的赋值语句改为
this.name = name;
this.age = age;
回复 使用道具 举报
public PersonDemo(String name, int age) {
           this. name = name;
            this.age = age;
    }
回复 使用道具 举报
上面的两个兄弟已经说了,没有写this关键字,其实构造函数参数列表中的两个变量相当于函数中的局部变量。它们并不是类中的成员变量。创建对象并对构造函数初始化时,你写的代码只是局部变量给自己赋值了。this代表创建本类的对象,是一个引用。指向了你创建的对象。当写上this关键字后,自然就会把值赋给对象中的成员变量了。
回复 使用道具 举报
因为你的局部变量已经存在name和age了,所以成员变量就无法被识别了,系统会首先识别 public PersonDemo(String name, int age) 里面的name和age
也就是说在编译的时候 name = name;    age = age;  在系统眼里左边和右边实际上就是一个变量。
所以在这个时候,你只有使用关键字this,才能够使编译器正确识别。
所以要改成下面的语句。
this.name = name;
this.age = age;
回复 使用道具 举报
public PersonDemo(String name, int age) {
                name = name;
                age = age;
        }
这段代码错误,name = name;
                age = age
没有把传递进来的变量赋值给PersonDemo中的name和age这两个变量,所以String类型的name默认值为null,int类型的变量默认值为0.
代码应该改成
public PersonDemo(String name, int age) {
                this.name = name;
                this.age = age;
        }

回复 使用道具 举报
李斌 中级黑马 2012-4-18 22:41:41
7#
这里有个关于this关键字的知识点,和你一起总结一下哦:当定义类中功能时候 该函数内部 要用到调用该函数的对象时,这时用this来表示这个对象,简单的说,说调用这个函数,this就代表谁。这该题中
PersonDemo pd=new PersonDemo("haha",111) ,pd变量调用了函数PersonDemo,并且将haha 和111 赋给
Stringname 和  int age,注意此时要用this来“代表”pd,实现将他们赋给成员变量。最终改变堆内存中元素的值。
回复 使用道具 举报
顺便说说this的几种用法吧,希望对你有帮助。
1,当成员变量和局部变量同名时。在方法中使用this时,表示的是此方法所在类中的成员变量。就像你写的例子中就是this的应用之一;
2,在构造函数中可以用this关键字调用同类中的其他构造函数。但是必须在构造函数中第一行。例如在你的PersonDemo类中有一个空参数的构造函数的话,可以在有参数的构造函数中通过this();调用;
3,this不能出现在静态函数中。因为在静态加载的时候对象还不存在。
4,在调用本类成员变量或者局部函数时,要用到,其原理和第一条相同,目的就是区分同名变量时应用。
回复 使用道具 举报
当然是这样的呀。因为name = name;age = age;在这里都是局部变量。必须指定其所属对象就不会了。this.name=name;this.age=age;就好了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马