黑马程序员技术交流社区

标题: 【LOOK!】this关键字是不是被取消了呢?这不是我想要的结果 [打印本页]

作者: 1017161726    时间: 2014-11-27 10:38
标题: 【LOOK!】this关键字是不是被取消了呢?这不是我想要的结果
毕老师的this关键字这块。。理论上来说,this.x=x 和x=x 是不一样的。但是执行的结果,没差别。

         

class Person
{
        private String name;
        private int age;
       
        Person()
        {
                System.out.println("A:name="+name+"        , age="+age);
                }
        Person(String name)
        {
                this.name=name;      //这里把this.去掉,执行结果没有差异。不知道为什么,是java升级了把这个this关键字省略了?
                System.out.println("B:name="+name+", age="+age);
                }
        Person(String name,int age)
        {
                this.name=name;
                this.age=age;
                System.out.println("C:name="+name+", age="+age);
                }
         }
class Demo
{
        public static void main(String[] args)
        {
                Person p1=new Person();
                Person p2=new Person("张三");
                Person p3=new Person("李四",22);
                }
        }

         


作者: 尚勇勇    时间: 2014-11-27 10:38
以下是正确答案,求仔细看,看完给分:

因为在类中定义了成员变量name和age,在Person(String name)构造方法中,定义了一个局部变量name
,而在这个局部变量中的代码如果写成   this.name=name,就是普通的成员变量赋值,如果写成
name=name,则两个name都属于Person(String name)这个构造方法中,与外面定义的成员变量没有任何关系,

有句话,就是方法自己有,绝不出去找

在构造方法中的输出语句System.out.println("B:name="+name+", age="+age);  }
在new这个Person p2=new Person("张三");对象时将“张三”传给Person(String name)构造方法中的
局部变量name,所以输出语句中可以打出“张三”,而输出语句中的agePerson(String name)构造方法中
没有定义,就自己找到成员的age

作者: 冬天的雪    时间: 2014-11-27 14:35
因为name是我们Person这个类中的一个成员变量,而我们调用Person的构造方法时,左边的name就会直接引用我们的成员变量了,右边的name就直接接受参数。
作者: juexinshi    时间: 2014-11-27 19:36
this关键词只可以于方法内部,表示“调用当前方法的对象”的引用。因此this的用法和其它的对象引用并无本质上的不同,只是在调用方法所在类的另外一个方法时不必要使用,对于所在类的域成员的访问理论上也是不需要this的,但是在方法参数名称和域成员名称一致时,可用this用来区分二者提高代码的可读性。(也有些人认为要形式化的将this放在所有的方法和域成员前,我感觉没必要如此,这样反而会增加代码的混乱程度)
   综上,在这种情形下,不是this被取消了,而是“不是语法上强制使用,仅仅是为了增加可读性”
作者: 雨过山更翠    时间: 2014-11-27 20:32
你的方法中的输出语句 System.out.println("B:name="+name+", age="+age);其中name和age输出的都是局部变量的值,也就是创建对象时输入的参数“张三”等。
如果你换成 name = name,  你就没有把值赋给对象中的name,如果你把输入语句中的name换成this.name输出结果就是null
作者: dong_xi_chao    时间: 2014-11-28 08:50
this关键词只可以于方法内部,表示“调用当前方法的对象”的引用。因此this的用法和其它的对象引用并无本质上的不同,只是在调用方法所在类的另外一个方法时不必要使用,对于所在类的域成员的访问理论上也是不需要this的,但是在方法参数名称和域成员名称一致时,可用this用来区分二者提高代码的可读性。
作者: 1017161726    时间: 2014-11-28 10:06
嗯,了解了。this不是被取消了,而是这里可以不写。
作者: jdedffjef83j    时间: 2014-11-30 20:32
学习了,this
作者: lwh316658735    时间: 2014-12-8 15:12
你那样写语法上是没错误的,但是是功能性错误。赋值错误




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