黑马程序员技术交流社区

标题: 黑马程序——关于this的一个小问题 [打印本页]

作者: 雨下阳光    时间: 2014-9-18 14:20
标题: 黑马程序——关于this的一个小问题
  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, 下载次数: 14)

4.PNG

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

犀利!很清楚了!谢谢!
作者: 雨下阳光    时间: 2014-9-18 15:49
爽朗的菜籽 发表于 2014-9-18 14:43
楼上解释的好清楚,我找半天资料。。。学习了

呵呵!一起学习,一起进步!
作者: liaorubei    时间: 2014-9-18 16:23
因为你在第二个实体化的时候没有给name字段赋值,然后name在默认情况下是空的,如果你用一个null的引用去调用方法,就会把空指针异常
作者: xplcc    时间: 2014-9-18 17:08
不加this的时候它会先找局部变量,局部变量没有,才会找成员变量




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