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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陆鹏 于 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
为什么呀?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

8 个回复

正序浏览
李盼 中级黑马 2012-6-16 08:31:08
9#
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还是没有被赋值的!
回复 使用道具 举报
郑冬 中级黑马 2012-6-15 18:48:27
8#
不加this是参数的name,而不是类的成员变量name
回复 使用道具 举报
有理由相信是不能赋值的,如下:
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:55

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个this是默认存在的~

既然默认,为什么经常要输入呢?
我觉得有俩原因:
1、很多时候输入this(尤其是在Eclipse中)是为了方便下一步的操作
   当你输入this.的时候后面直接会刷~的出现一串,这样你选就可以啦,不用再全部操作~
2、方便阅读~要不就像这里的name = name;一样容易看的晕~
回复 使用道具 举报
楼主,请注意你打印打并非是成员变量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:43

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个是可以的,其实name=name;就是this.name=name。只是省略了this。
在这里之所以一般都写this.name=name  是为了当方法参数与变量名相同时,用于区分参数名与变量名用的
回复 使用道具 举报
构造函数
Person(String name)
{
          name=name;
          System.out.println("name="+name);
},其中的name=name;实际上是给参数name赋值,而不是给类中成员变量的name赋值,打印出来的name其实是Person()中的参变量

点评

回答对了,不过没有楼下全。  发表于 2012-6-15 18:43
回复 使用道具 举报
构造函数中 给成员变量赋值时 this关键字可以省略
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马