黑马程序员技术交流社区

标题: 大家帮我看看这里的this关键字使用. [打印本页]

作者: Adjin    时间: 2014-7-12 19:39
标题: 大家帮我看看这里的this关键字使用.
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                name=name;
                age=age;
                speak();
        }
        public void speak()
        {
                System.out.println("name="+name+"  "+"age="+age);
        }
}
class PersonTest
{
        public static void main (String [] args)
        {
                Person p=new Person("zhangsan",10);
        }
}
---------------------------------------------------------------------------------------------------------------------
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                name=name;
                age=age;
                System.out.println("name="+name+"  "+"age="+age);
        }
       
}
class PersonTest
{
        public static void main (String [] args)
        {
                Person p=new Person("zhangsan",10);
        }
}
为什么第一个初始化失败,第二个ok?
作者: doubandddk    时间: 2014-7-12 20:00
哪个都不行吧 得用this

作者: yuli2039    时间: 2014-7-12 20:20
doubandddk 发表于 2014-7-12 20:00
哪个都不行吧 得用this

第二个我测试了一下可以 赋值成功,有点不明白为什么没有用this也能成功!刚学的菜鸟

第一个 应该是 引用speak()方法造成的
作者: 寻得美好    时间: 2014-7-12 21:02
其实第二个也是失败的,能打印出来是因为System语句中的name ,age是你构造函数中的局部变量,赋值的语句是多余的,你将私有的成员变量name,age以及赋值语句删掉,第二个也能打印出来
验证第二个失败的方法是在neme,age前加上this.  后再编译运行,你就会看到其实赋值没有成功
当定义的局部变量与类中的成员变量同名时,成员变量前要加this.  
作者: Adjin    时间: 2014-7-12 21:18
寻得美好 发表于 2014-7-12 21:02
其实第二个也是失败的,能打印出来是因为System语句中的name ,age是你构造函数中的局部变量,赋值的语句是 ...

明白了,谢谢
作者: 燿陚√揚葳    时间: 2014-7-12 21:22
应该说是两个初始化都失败了,
第一个之所以输出的是null和0是因为speak方法打印的是this.name和this.age,而这里的this是可以省略不写的,而构造函数中的name=name,age=age
就相当于是1=1了,两个name是同一个变量(这里你要注意局部变量和成员变量的区别,当成员变量和局部变量名字一样时,用this来区分,不然会出现1=1的情况),speak方法中调用的是成员变量,而构造函数上的两个是局部变量,不是一回事,你只是给局部变量赋了值,而调用的却是成员变量

如果第一个你能理解的话,那么第二个也就明白怎么回事了,简单的说就是你给局部变量赋了值,然后打印输出你赋的这两个值,和成员变量没有关系了(局部变量只在本方法内有效,成员变量作用与整个类中),所以说第二个初始化也是失败的,并不是说输出你赋的值他就是初始化成功了,是要给成员变量赋值





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