黑马程序员技术交流社区

标题: this 语句的问题 [打印本页]

作者: 只想要一盏灯    时间: 2013-10-16 11:08
标题: this 语句的问题
本帖最后由 只想要一盏灯 于 2013-10-16 13:21 编辑

这个是我在资料上看到的对this语句加强理解的练习。有图有程序,真心表示看不懂,求指导一下,谢谢!
输出结果是hello world
第一个问题:private Temp temp ;这个要怎么理解呢?
第二个问题:能不能给我解释下实现过程,最好能帮我把图片的步骤理清楚,谢谢大家了!

观察如下程序的输出结果—— 本程序没有任何实际意义,只是为了加强this的理解。
class Demo
{
        private Temp temp ;

        public Demo()
        {
                this.temp = new Temp(this) ;
                this.temp.fun() ;
        }

        public void print()
        {
                System.out.println("Hello World!!!") ;
        }

}
        
class Temp
{
        private Demo demo ;

        public Temp(Demo demo)
        {
                this.demo = demo ;
        }

        public void fun()
        {
        
        this.demo.print() ;

        }
}

public class ThisDemo
{
        public static void main(String args[])
        {
                Demo d = new Demo() ;
        }
}

这个是图解,表示看不清顺序

QQ截图20131016111015.png (24.95 KB, 下载次数: 17)

QQ截图20131016111015.png

作者: 做只会飞的鱼    时间: 2013-10-16 11:30
本帖最后由 做只会飞的鱼 于 2013-10-16 11:35 编辑

第一个问题:private Temp temp ;这个要怎么理解呢?
Demo类的一个成员变量temp是Temp类型的,引用变量名叫temp
第二个问题:能不能给我解释下实现过程,最好能帮我把图片的步骤理清楚,谢谢大家了!
1,main方法里通过new Demo() ;
调用Demo类的无参构造器Demo()
2,Demo()无参构造器通过
this.temp = new Temp(this) ;
调用Temp类的构造器Temp(Demo demo)
这里的参数this既是当前要实例化的Demo类的对象
3,Temp(Demo demo)构造器通过
this.demo = demo ;//这里的this是Demo类实例化的这个对象
使传进来的参数Demo引用的对象被Temp的成员变量demo引用
4,Temp(Demo demo)构造器执行完毕,继续执行
Demo()构造器的下一行代码:
this.temp.fun() ;
调用调用构造器实例化的当前对象(this)的成员变量temp的fun()方法
5,temp属性的方法fun()又通过
this.demo.print() ;
调用temp对象的成员变量demo的print()方法
6,demo对象调用print()方法打印出helloworld.
程序运行结束.
其实就是两个类的对象互为对方的成员变量,在实例化Demo类的对象时候
通过一系列互相调用对方的构造方法,实例方法.就是让你知道
你调用了一个类的实例方法或者构造方法,那里面的this就指代这个类的调用这个方法的当前对象.

作者: kellyzyb    时间: 2013-10-16 11:47
  private Temp temp ; 这一句很简单啊,Temp是一个类,temp 给这个类起了个名字 相当于Temp temp = null; 建立了一个私有的temp空引用。

当主函数执行时,Demo d = new Demo() ; 在栈内存中创建了Demo d这个变量 和temp 这个变量(空地址) 堆内存中new出了一个demp对象,d指向了这个对象。

demo里面有构造函数。用于对demo对象进行初始化。在构造函数中this.temp = new Temp(this) ;
在堆内存中又new出一个temp对象。this.temp 将地址中赋给了d这个对象中的temp.至于Temp里面没啥实际意义。用毕老师的一句话,哪个对象在调用this所在的函数,this就代表哪个对象。当d这个对象里的构造方法调用this时,其实就是d.temp = new Temp();
作者: 郑齐育    时间: 2013-10-16 13:11
1.在demo中定义temp对象,方便与调用temp中的方法,并且在demo的构造方法中实例temp对象,就是为了保证在demo中会有temp对象,以免忘记初始化temp对象,这是一个小技巧,在开发中会用到。
2.两个类中互相持有对方对象的引用,Demo d = new Demo();创建demo对象,temp先入栈,demo的引用后入栈,然后demo构造方法开始执行,在demo的构造方法中先执行temp的构造方法开始执行,然后在回到demo中的构造方法。
package quiz;

public class ThisDemo {

        public static void main(String[] args) {
                Demo d = new Demo();
                System.out.println(d);//得知和(3)中的对象是同一个
        }

}
class Demo {
        private Temp temp;
        public Demo() {
                System.out.println("demo构造方法");//(1)
                this.temp = new Temp(this);
                System.out.println(this.temp);//(4)demo中的temp
                this.temp.fun();
        }
        public void print() {
                System.out.println("Hello World!!!");//(5)Demo中的temp先调用fun()方法,但是fun()中有调用Demo的print方法。
        }
}
class Temp {
        private Demo demo;
        public Temp(Demo demo) {
                System.out.println("temp构造方法");//(2)
                this.demo = demo;
                System.out.println(this.demo);//(3)temp中的demo
        }
        public void fun() {
                this.demo.print();
        }
}
打印结果为:
demo构造方法
temp构造方法
quiz.Demo@527c6768
quiz.Temp@65690726
Hello World!!!
quiz.Demo@527c6768
善用打印可以轻易的了解代码的执行顺序。
作者: 郑齐育    时间: 2013-10-16 13:12
弄太久 第一个想回复变成第三个了 。。。。
作者: 只想要一盏灯    时间: 2013-10-16 13:17
做只会飞的鱼 发表于 2013-10-16 11:30
第一个问题:private Temp temp ;这个要怎么理解呢?
Demo类的一个成员变量temp是Temp类型的,引用变量名叫t ...

多谢啦,很详细!:handshake
作者: 只想要一盏灯    时间: 2013-10-16 13:28
郑齐育 发表于 2013-10-16 13:12
弄太久 第一个想回复变成第三个了 。。。。

呵呵,谢啦,希望版主给你也加个技术分呢,很详细!
作者: 郑齐育    时间: 2013-10-16 13:43
希望如此 我跟版主说下




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