黑马程序员技术交流社区

标题: 关于this的一个小问题 [打印本页]

作者: Adjin    时间: 2014-7-16 18:51
标题: 关于this的一个小问题
class Person
{
        private String name;
        Person(String name)
        {
                this.name=name;
                System.out.println("name="+name);
                speak();
        }
        void speak()
        {
                System.out.println("name="+name);
        }
}
class PersonDemo
{
        public static void main (String [] args)
        {
                Person p=new Person ("zhang");
                p.speak();
        }

}
在构造函数中,name前面不加this就会赋值错误,那么,在输出语句中,写name,我输出的是传进来的参数name,还是成员变量this?默认有this.name等于打印的是成员变量this,为什么这里又可以隐藏了呢?不写的话,s.o.p(name)和赋值时候name都在局部,怎么不是局部的name?
不知道大家听没听明白我的表达
作者: 乐此不疲    时间: 2014-7-16 19:20
不是打印3句name=zhang么
作者: fantacyleo    时间: 2014-7-16 19:52
所谓局部变量,是在某个方法内声明的变量。所以说局部变量,完整的表述是要讲清楚哪个方法的局部变量。比如,Person构造函数的name局部变量。局部变量的作用范围仅限于方法中,出了方法就不能访问了。那么,speak方法中肯定是不能访问Person构造函数中的name局部变量的。而speak中又没有声明一个叫name的局部变量,name就是指成员变量,不存在名字的冲突,无须加this
作者: 一十二。    时间: 2014-7-16 20:14
this  dai代表的是当前类的局部变量,  没this就是方法里的变量,我是这么理解的
作者: 天涯无痕    时间: 2014-7-16 21:43
一个是赋值的语句  是有指向的   而输出就没有什么指向了吧  
作者: yuli2039    时间: 2014-7-16 22:04
没明白你表达什么意思,你这里根本没定义局部变量嘛!!
作者: 闪电博尔特    时间: 2014-7-16 22:46
在这里你的有参数构造方法Person()里面输出name属性;且输出语句在name赋值给this之后,我认为输出的是this当前对象的属性name;如果输出语句在给this赋值之前,输出则是传进来的name参数;也就是实例化对象时“zhang”的堆内存;speak函数也无局部变量name输出自然可以不加this,默认会从this中找name属性;但这不是一个好的习惯;
作者: OCTSJimmy    时间: 2014-7-16 23:20
一切局部变量优先于本类中的成员属性,所以就可以理解了。即使在传入参数中定义变量,也属于局部变量的一种。并且,局部变量还牵涉到有效域的问题。如此可懂?
作者: hejinzhong    时间: 2014-7-17 02:30
  1. //主函数开始看起

  2. class Person
  3. {
  4.         private String name;//成员变量,在建立对象的时候,存在与对象中,默认是null
  5.         Person(String name)//这行的name是局部变量
  6.         {
  7.                 this.name=name;//将局部name的值赋值给调用该构造函数的对象中的name,即p的name
  8.                 System.out.println("name="+name);//输出局部name的值,优先在本函数中找,没有才去类中找。这里有局部name(函数有name)
  9.                 speak();//调用speak方法输出的还是局部name,因为speak函数中没有,但调用他的函数person中有name(局部的)
  10.         }
  11.         void speak()
  12.         {
  13.                 System.out.println("name="+name);
  14.         }
  15. }

  16. class PersonDemo
  17. {
  18.         public static void main (String [] args)
  19.         {
  20.                 Person p=new Person ("zhang");//这里建立Person的对象,转向Person的构造函数
  21.                 p.speak();//p调用speak输出自己的name。
  22.         }

  23. }
复制代码

作者: mytongyong    时间: 2014-7-17 07:36
同名变量是现在局部找,然后在到全局找。




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