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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 雨下阳光 中级黑马   /  2014-9-18 14:20  /  1676 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. ------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------
复制代码

class Person
{      String name;
        int age;
        Person(String n)
        {   this.name=n;}
        Person()
        { name="王钗";}       
        Person(String name,int a)
        {name=name; age=a;}
        void speak()
        {System.out.println(name+":"+age);}
        public boolean compare(Person p)
        {return (this.age)==(p.age);}
}
class  Pest{
        public static void main(String[] args)
        {
               Person p1=new Person("小强",4);
                p1.speak();
                Person p=new Person();
                p.speak();
        }
}
疑问:如图红色文字,没用this区分name的时候,调用时应该还有一种可能:是“小强”先赋给了右边的name,然后再赋给左边的name,这时候不管左边的name是成员变量还是区域变量,不都是被赋给了“小强”吗?结果这时候该是“小强”。可是结果直接是“null“,这里应该是报错吗?



4.PNG (59.84 KB, 下载次数: 16)

4.PNG

6 个回复

倒序浏览
你要了解成员变量和局部变量的区别,局部变量是在栈里面,声明的时候没有默认值,成员变量是在堆里面,声明的时候默认是null,
Person(String name,int a)
        {name=name; age=a;}这里没有指定是哪个变量默认就是局部变量.也就是自己赋给了自己而且都是在栈里面,和成员变量没有发生关系.打印的时候打的是成员变量因此是null,想要让成员变量接收就要指定这个成员变量.用this来指定他.
这里编译和运行都没有问题,为什么要报错呢?
回复 使用道具 举报
楼上解释的好清楚,我找半天资料。。。学习了
回复 使用道具 举报
Fightin黑马 发表于 2014-9-18 14:31
你要了解成员变量和局部变量的区别,局部变量是在栈里面,声明的时候没有默认值,成员变量是在堆里面,声明的时 ...

犀利!很清楚了!谢谢!
回复 使用道具 举报
爽朗的菜籽 发表于 2014-9-18 14:43
楼上解释的好清楚,我找半天资料。。。学习了

呵呵!一起学习,一起进步!
回复 使用道具 举报
因为你在第二个实体化的时候没有给name字段赋值,然后name在默认情况下是空的,如果你用一个null的引用去调用方法,就会把空指针异常
回复 使用道具 举报
xplcc 中级黑马 2014-9-18 17:08:08
7#
不加this的时候它会先找局部变量,局部变量没有,才会找成员变量
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马