黑马程序员技术交流社区

标题: 构造函数参数与类中的变量重名时不用this也可以赋值。Why? [打印本页]

作者: 陆鹏    时间: 2012-6-15 18:22
标题: 构造函数参数与类中的变量重名时不用this也可以赋值。Why?
本帖最后由 陆鹏 于 2012-6-15 18:44 编辑

class Person
{
         String name;
        Person(String name)
        {
                name=name;
                System.out.println("name="+name);
              }
}
class Demo
{
        public static void main(String[] args)
        {
                Person a=new Person("Jack");
                }
}
结果:name=Jack
为什么呀?
作者: 麦田守望者0812    时间: 2012-6-15 18:28
构造函数中 给成员变量赋值时 this关键字可以省略
作者: 火焱    时间: 2012-6-15 18:30
构造函数
Person(String name)
{
          name=name;
          System.out.println("name="+name);
},其中的name=name;实际上是给参数name赋值,而不是给类中成员变量的name赋值,打印出来的name其实是Person()中的参变量

作者: 晏文根    时间: 2012-6-15 18:33
这个是可以的,其实name=name;就是this.name=name。只是省略了this。
在这里之所以一般都写this.name=name  是为了当方法参数与变量名相同时,用于区分参数名与变量名用的
作者: 宋浩    时间: 2012-6-15 18:33
楼主,请注意你打印打并非是成员变量name的值,而是形参name的值:
  1. class Person
  2. {
  3. String name;
  4. Person(String name)
  5. {
  6. name=name;
  7. System.out.println("name="+name);//这里打印的参数name,不是成员变量
  8. }
  9. }
  10. public class Demo
  11. {
  12. public static void main(String[] args)
  13. {
  14. Person a=new Person("Jack");
  15. System.out.println("name:"+a.name);
  16. }
  17. }
复制代码
运行结果如下:
name=Jack
name:null
如果不想用this的话,必须不要跟成员变量的名字相同,要不就要加this 。。。

作者: 张洁    时间: 2012-6-15 18:38
这个this是默认存在的~

既然默认,为什么经常要输入呢?
我觉得有俩原因:
1、很多时候输入this(尤其是在Eclipse中)是为了方便下一步的操作
   当你输入this.的时候后面直接会刷~的出现一串,这样你选就可以啦,不用再全部操作~
2、方便阅读~要不就像这里的name = name;一样容易看的晕~
作者: 陌花╮有意、    时间: 2012-6-15 18:42
有理由相信是不能赋值的,如下:
class Person {
String name;
Person(String name) {                                  //1.2
  name = name;                                           //1.3  这里的name是与Person类定义的name属性无关的
  System.out.println("name=" + name);         //1.4  之所以能打印,是由于传入的局部变量name的作用域还有效
}
}
class Demo6 {
public static void main(String[] args) {
  
  Person a = new Person("Jack");                     //1.1  程序从这里执行

System.out.println(a.name);                          //1.5 从这里的打印结果就可以验证并未赋值成功
}
}

结果:
name=Jack
null


作者: 郑冬    时间: 2012-6-15 18:48
不加this是参数的name,而不是类的成员变量name
作者: 李盼    时间: 2012-6-16 08:31
class Person
{
          String name;
         Person(String name)
         {
                 name=name;
                 System.out.println("name="+name);
               }
}
你没加this,那么name就是这个构造函数内部的局部变量name了,而你的SOP又是在构造函数内部,所以打印的当然是局部变量啊,如果你把SOP移出来,或者 System.out.println("name="+this.name);试试看,就知道成员变量name还是没有被赋值的!





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