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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Adjin 中级黑马   /  2014-7-12 19:39  /  1256 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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?

5 个回复

倒序浏览
哪个都不行吧 得用this
回复 使用道具 举报
doubandddk 发表于 2014-7-12 20:00
哪个都不行吧 得用this

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

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

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

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