黑马程序员技术交流社区

标题: 一个java小问题(已解决) [打印本页]

作者: 韩新凯    时间: 2012-4-18 21:58
标题: 一个java小问题(已解决)
本帖最后由 韩新凯 于 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,为什么没有赋值成功?

作者: 李平    时间: 2012-4-18 22:00
在PersonDemo 类中的赋值语句改为
this.name = name;
this.age = age;
作者: liuyang    时间: 2012-4-18 22:01
public PersonDemo(String name, int age) {
           this. name = name;
            this.age = age;
    }
作者: zhaishuang    时间: 2012-4-18 22:18
上面的两个兄弟已经说了,没有写this关键字,其实构造函数参数列表中的两个变量相当于函数中的局部变量。它们并不是类中的成员变量。创建对象并对构造函数初始化时,你写的代码只是局部变量给自己赋值了。this代表创建本类的对象,是一个引用。指向了你创建的对象。当写上this关键字后,自然就会把值赋给对象中的成员变量了。
作者: 王永旺    时间: 2012-4-18 22:22
因为你的局部变量已经存在name和age了,所以成员变量就无法被识别了,系统会首先识别 public PersonDemo(String name, int age) 里面的name和age
也就是说在编译的时候 name = name;    age = age;  在系统眼里左边和右边实际上就是一个变量。
所以在这个时候,你只有使用关键字this,才能够使编译器正确识别。
所以要改成下面的语句。
this.name = name;
this.age = age;

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2