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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Adjin 中级黑马   /  2014-7-16 18:51  /  1655 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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?
不知道大家听没听明白我的表达

9 个回复

倒序浏览
不是打印3句name=zhang么
回复 使用道具 举报
所谓局部变量,是在某个方法内声明的变量。所以说局部变量,完整的表述是要讲清楚哪个方法的局部变量。比如,Person构造函数的name局部变量。局部变量的作用范围仅限于方法中,出了方法就不能访问了。那么,speak方法中肯定是不能访问Person构造函数中的name局部变量的。而speak中又没有声明一个叫name的局部变量,name就是指成员变量,不存在名字的冲突,无须加this
回复 使用道具 举报
this  dai代表的是当前类的局部变量,  没this就是方法里的变量,我是这么理解的
回复 使用道具 举报
一个是赋值的语句  是有指向的   而输出就没有什么指向了吧  
回复 使用道具 举报
没明白你表达什么意思,你这里根本没定义局部变量嘛!!
回复 使用道具 举报
在这里你的有参数构造方法Person()里面输出name属性;且输出语句在name赋值给this之后,我认为输出的是this当前对象的属性name;如果输出语句在给this赋值之前,输出则是传进来的name参数;也就是实例化对象时“zhang”的堆内存;speak函数也无局部变量name输出自然可以不加this,默认会从this中找name属性;但这不是一个好的习惯;
回复 使用道具 举报
一切局部变量优先于本类中的成员属性,所以就可以理解了。即使在传入参数中定义变量,也属于局部变量的一种。并且,局部变量还牵涉到有效域的问题。如此可懂?
回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报
同名变量是现在局部找,然后在到全局找。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马