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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
毕老师的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);
                }
        }

         

最佳答案

查看完整内容

以下是正确答案,求仔细看,看完给分: 因为在类中定义了成员变量name和age,在Person(String name)构造方法中,定义了一个局部变量name ,而在这个局部变量中的代码如果写成 this.name=name,就是普通的成员变量赋值,如果写成 name=name,则两个name都属于Person(String name)这个构造方法中,与外面定义的成员变量没有任何关系, 有句话,就是方法自己有,绝不出去找 在构造方法中的输出语句System.out.println("B:name="+n ...

8 个回复

倒序浏览
以下是正确答案,求仔细看,看完给分:

因为在类中定义了成员变量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
回复 使用道具 举报
因为name是我们Person这个类中的一个成员变量,而我们调用Person的构造方法时,左边的name就会直接引用我们的成员变量了,右边的name就直接接受参数。
回复 使用道具 举报
this关键词只可以于方法内部,表示“调用当前方法的对象”的引用。因此this的用法和其它的对象引用并无本质上的不同,只是在调用方法所在类的另外一个方法时不必要使用,对于所在类的域成员的访问理论上也是不需要this的,但是在方法参数名称和域成员名称一致时,可用this用来区分二者提高代码的可读性。(也有些人认为要形式化的将this放在所有的方法和域成员前,我感觉没必要如此,这样反而会增加代码的混乱程度)
   综上,在这种情形下,不是this被取消了,而是“不是语法上强制使用,仅仅是为了增加可读性”
回复 使用道具 举报
你的方法中的输出语句 System.out.println("B:name="+name+", age="+age);其中name和age输出的都是局部变量的值,也就是创建对象时输入的参数“张三”等。
如果你换成 name = name,  你就没有把值赋给对象中的name,如果你把输入语句中的name换成this.name输出结果就是null
回复 使用道具 举报
this关键词只可以于方法内部,表示“调用当前方法的对象”的引用。因此this的用法和其它的对象引用并无本质上的不同,只是在调用方法所在类的另外一个方法时不必要使用,对于所在类的域成员的访问理论上也是不需要this的,但是在方法参数名称和域成员名称一致时,可用this用来区分二者提高代码的可读性。
回复 使用道具 举报
嗯,了解了。this不是被取消了,而是这里可以不写。
回复 使用道具 举报
学习了,this
回复 使用道具 举报
你那样写语法上是没错误的,但是是功能性错误。赋值错误
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马