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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张庚 中级黑马   /  2013-2-3 23:29  /  2448 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-2-6 14:54 编辑

*
当成员变量和局部变量重名,可以用关键字this来区分。

this : 代表对象。代表哪个对象呢?当前对象。
           this就是所在函数所属对象的引用。
           简单说:哪个对象调用了this所在的函数,this就代表哪个对象。

this也可以用于在构造函数中调用其他构造函数。
注意:只能定义在构造函数的第一行。因为初始化动作要先执行。
*/

class Person
{
        private String name;
        private int age;        
        Person()
        {               
                name = "baby";
                age = 1;
                System.out.println("person run");
        }        
        Person(String name)        
        {
                this();
                this.name = name;
        }
        Person(String name,int age)
        {
                this.name = name;
                this.age = age;               
        }
        public void speak()
        {
                System.out.println(this.name+":"+this.age);
        }

        /*
        判断是否是同龄人。
        */
        public boolean compare(Person p)
        {
                /*
                if(this.age==p.age)
                        return true;
                else
                        return false;
                */
                return this.age==p.age;
        }

}

class ThisDemo
{
        public static void main(String[] args)
        {

                Person p1 = new Person("aa",30);//
                Person p2 = new Person("zz",12);

                p2.compare(p1);
//                new Person();
//                Person p = new Person("旺财",30);
//                p.speak();
//                Person p1 = new Person("小强");
//                p1.speak();
        }
}


上面老毕说到   this : 代表对象 又说到只能定义在构造函数的第一行

那那里来的对象啊  不是很理解  求解答???

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

9 个回复

倒序浏览
     呵呵,这个问题问的有点深。其实源于一种误解。一位在构造方法执行之前对象没有产生,而实际的情形并不是这样。一个对象并不是完全由构造方法来负责创建的。实际上,当程序员调用构造器时,系统会先为对象分配内存空间,并未这个对象执行默认初始化,这个对象已经产生了——这些操作在构造器之前就已经完成了。也就是说,当系统开始执行构造器的执行体之前,系统已经创建了一个对象,知识这个对象还不能被外部程序所访问,只能在构造器通过this来引用它。当构造器的执行体执行结束之后,这个对象作为构造器的返回值被返回。
     以上的解释并非出于我个人,而是我看过的解释得最清晰的资料,希望对你有帮助。如有疑问,可以讨论。
回复 使用道具 举报
      由于有些关键字句出了问题,为避免造成不好的影响,我修改后重发一遍。
      呵呵,这个问题问的有点深。其实源于一种误解。以为在构造方法执行之前对象没有产生,而实际的情形并不是这样。一个对象并不是完全由构造方法来负责创建的。实际上,当程序调用构造器时,系统会先为对象分配内存空间,并为这个对象执行默认初始化,这个对象已经产生了——这些操作在构造器之前就已经完成了。也就是说,当系统开始执行构造器的执行体之前,系统已经创建了一个对象,只是这个对象还不能被外部程序所访问,只能在构造器通过this来引用它。当构造器的执行体执行结束之后,这个对象作为构造器的返回值被返回。构造器的另外一个作用就是为对象的属性重新赋值。
     以上的解释并非出于我个人,而是我看过的解释得最清晰的资料,希望对你有帮助。如有疑问,可以讨论。

评分

参与人数 1黑马币 +5 收起 理由
黄锦成 + 5

查看全部评分

回复 使用道具 举报
本帖最后由 张文彬 于 2013-2-4 00:26 编辑

JAVA程序都是从主函数进入的, 像你这个程序
Person p1 = new Person("aa",30);
Person p2 = new Person("zz",12);
这就是两个对象啊,下面构造函数里的this就是代表上面两个对象的,下面这个构造函数就是为了上面这两个对象初始化的。
Person(String name,int age)
{
                 this.name = name;
                 this.age = age;               
}
而下面这个构造函数
Person(String name)        
        {
                 this();
                 this.name = name;
         }
中的this代表的就是Person p1 = new Person("小强");这个对象。
因为这个程序是构造函数重载现象,看参数就好了。

不知道你是不是这个意思。。。。希望能帮到你

回复 使用道具 举报
毕老师关于this关键字的讲解,我也是刚刚看完。根据我的理解给你回答一下,大家多多交流嘛。
根据毕老师在视频里面的讲解,对象已建立就会调用与之对应的构造函数。这里所指的对象就是你在主方法里面建立的对象,然而在this在用于构造函数之间的互相调用时,this应定义在构造函数第一行,与对象没有冲突,还是指的是主方法里面定义的对象。

评分

参与人数 1黑马币 +5 收起 理由
黄锦成 + 5

查看全部评分

回复 使用道具 举报
只能定义在构造函数第一行的不是this,是super;调用子类构造方法时,它会先调用父类的构造方法,以完成初始化,系统默认提供一个super(),它只对有空参构造方法的父类有效,如果父类没有空参的构造方法,你就只能调显式调用super了。
回复 使用道具 举报
高贵杰 发表于 2013-2-4 00:22
毕老师关于this关键字的讲解,我也是刚刚看完。根据我的理解给你回答一下,大家多多交流嘛。
根据毕老师在 ...

逛论坛这么长时间,终于见到有妹纸了发言了:lol
回复 使用道具 举报
沈文杰 来自手机 中级黑马 2013-2-4 00:46:10
8#
this 代表当前正在调用该方法的对象,在new 地一个对象p1时,调用两个参数的构造函数,this. name相当于p1.name,等号右此边的name 被传入的aa 替换,同样的在调用比较方法时,this. age 就是当前正在调用它的1.age,p. age 就是传进来的p 2.age

评分

参与人数 1黑马币 +8 收起 理由
黄锦成 + 8

查看全部评分

回复 使用道具 举报
我个人是这么认为的:
举个例子来说:我们事先是不知道要创建什么对象的,就相当于说,今天讲数学的老师没来上课,但是会有一个代课老师来,可能来说,哪个同学也不知道是哪个代课老师来讲课,但是讲台仍然是要给这个将要来的老师的;也就是说这个讲台是预留给这个老师的。
好啦,回到你说的这个问题上来,就是说,不管创没创建对象,都是会预留这个变量的,那么this就是代表预留的这个对象,你用this就好像是虚拟机知道有这么一个对象要创建一样,给将来的这个对象预留了一个位置,就像给客人预留了一件客房一样(我个人认为啊)。
我个人的另一个想法是:
这和程序在内存中的顺序有关:当你运行javac ThisDemo.java的时候,会生成两个class文件,一个是ThisDemo.class文件。另一个是Person.class文件。当你运行java ThisDemo的时候,是进行了下面的操作:
1、先从main方法作为入口进入
2、执行Person p1 = new Person("aa",30);语句,在此之前,是没有用到Person类中的方法或变量的,也就是说,在这之前,Person类中的代码仅仅是被JVM虚拟机编译器编译的代码。
这句创建对象的代码,是这样执行的:
1)new会用到Person.class,会先找Person.class,并将文件加载到内存中;
2)如有static,则执行类中的static代码块,并对类初始化,没有则进行下一步;
3)堆内存中开辟空间,分配内存地址;
4)在对内存中建立对象特有属性,并对其进行默认的初始化(如name=mull,age=0等);
5)对属性进行显式初始化(如name="aa",age=30);
6)对对象进行构造函代码块初始化(如果有的话);
7)对对象进行构造函数初始化;
8)将内存地址赋给栈内存中的变量p1。
也就是说在对构造函数初始化之前,内存中就已经存在了这个new Person("aa",30)的对象,那么this就是代表这个对象,再new Person("小强")这个对象,那么this就代表这个对象。
其实还是一个实现顺序的问题,只要把在内存中的先后顺序弄清楚了,就都明白了
不知道对你有没有帮助,如果有疑问,可以共同再探讨,或者请教高手和老师解答。

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1

查看全部评分

回复 使用道具 举报
你好, 可以去看我的这篇博客,里面有这方面的介绍http://blog.csdn.net/dingxiang506/article/details/8488478
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马