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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM张勇 高级黑马   /  2013-5-5 09:42  /  1849 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

毕老师视频中的练习,有个地方不明白:
  1. class Res
  2. {
  3. String name;
  4.         String sex;
  5. }

  6. class Input implements Runnable
  7. {
  8.         private Res r;//这里不是很明白。Res r与Res r = new Res();有何区别?
  9.         Input(Res r)
  10.         {
  11.                 this.r = r;
  12.         }
  13.         public void run()
  14.         {
  15.                 int x = 0;
  16.                 while (true)
  17.                 {
  18.                         synchronized(r)
  19.                         {
  20.                                 if (x == 0)
  21.                                 {
  22.                                         r.name = "mike";
  23.                                         r.sex = "man";
  24.                                 }
  25.                                 else
  26.                                 {
  27.                                         r.name = "丽丽";
  28.                                         r.sex = "女女女女女女";
  29.                                 }
  30.                                 x = (x + 1)%2;
  31.                         }
  32.                 }
  33.        
  34.         }
  35. }

  36. class Output implements Runnable
  37. {
  38.         private Res r ;
  39.         Output(Res r)
  40.         {
  41.                 this.r = r;
  42.         }
  43.         public void run()
  44.         {
  45.                 while (true)
  46.                 {
  47.                         synchronized(r)
  48.                         {
  49.                                 System.out.println(r.name+"..."+r.sex);
  50.                         }
  51.                 }
  52.         }
  53. }

  54. class InputOutputDemo
  55. {
  56.         public static void main(String[] args)
  57.         {
  58.                 Res r = new Res();

  59.                 Input in = new Input(r);
  60.                 Output out = new Output(r);

  61.                 Thread t1 = new Thread(in);
  62.                 Thread t2 = new Thread(out);

  63.                 t1.start();
  64.                 t2.start();

  65.         }
  66. }
复制代码
private Res r;//这里不是很明白。Res r与Res r = new Res();有何区别?这到底有没有创建对象?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

11 个回复

倒序浏览
本帖最后由 xuluheng718 于 2013-5-5 09:59 编辑

Res r是声明一个Res的对象r,但是没有初始化,也就是说r还没有任何堆内存的地址指向
Res r = new Res();  这是声明一个Res对象并且实现了初始化,这里的r在栈内存中指向了Res()的堆内存地址

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Res r = new Res();是创建资源。input类在创建初始化的时候把Res这个类作为资源,
通过构造函数
Input(Res r)
        {
                this.r = r;
        }。
传递给input这个类里面。意义是不一样的。
回复 使用道具 举报
Res r = new Res() ;这才是真的创建对象。使用Res r = new Res();语句在堆内存中创建对象,然后用 Input in = new Input(r);将创建的对象的地址传递给Input类中的private Res r 这个变量。相当于Input中的r变量有了一个对象的引用。也就可以使用Res r = new Res();创建的对象的资源了。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Res r是声明一个Res的对象引用类型的r,但是没有指向任何实际对象,也就是说r还没有指向堆内存的对象。打个比方,相当于代词‘他’,这个它没有指向任何人的那个状态。但是‘他’这个代词(相当于这里的r)可以用来指向任何人,只是现在没有指向任何人而已。
Res r = new Res();  这是声明一个Res对象引用r, 并且指向了在栈内存中新创建的一个实际对象。(至于指向是什么意思,就是r这个变量存的是这个新创建对象的地址)
此时,通俗的讲,还是那个代词'他',此时这个代词指向实际的一个人,这个'他' 可以代表任何人,就像你可以叫任何人'他'。道理是一样的。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Res r 只是在栈中声明了一个res类的变量,而Res r = new Res() 是在栈中声明了一个reg类的r变量后,又在堆内存中开辟了一个reg类的对象的空间,这才是创建了一个真实存在的对象,然后把这个对象的内存地址赋给栈内存中的r。
回复 使用道具 举报
private Res r ;     //这个没有创建对象  仅仅是声明了一个引用 还没有初始化 。  

Input(Res r)     //定义上面那句话的目的是:可以让Input和Output的构造函数接收这个引用型变量 。
        {
                this.r = r;
        }

  主函数中:Res   r = new  Res();  // 这才是真正的创建Res的对象,
回复 使用道具 举报
Res r是声明一个Res的对象r,但是没有初始化。也就是说在堆内存里面没有 Res这个东西。
Res r = new Res();  这是声明一个Res对象并且实现了初始化,这里的r在栈内存中指向了Res()的堆内存地址
回复 使用道具 举报
山西_李帅 来自手机 中级黑马 2013-5-5 13:06:59
9#
十几天的话,楼主是不是学到多态那里了。
这里用的是以后学IO流时讲到的包装设计模式。给你大体写下步骤,你先简单理解下。
什么叫包装设计模式?
在编程中我们发现一个类的功能不够好,我们可以对这个类进行包装,把它的功能增强。
1.通过构造函数接受一个被包装的类
2.用成员函数引用
3.具有和被包装类相同的方法
4.调用原对象的方法,进行增强。
这里用的就是楼主你遇到的问题,将对象作为成员属性,通过构造函数引用创建它的对象。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Res r = new Res();是创建了一个Res类的对象,已经在内存中开辟了空间;
而private Res r;只是声明了一个Res类型的变量,由于该变量是成员变量,所以存储与堆内存中。
回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
黄玉昆 发表于 2013-5-5 22:41
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢

我在网吧上的网,尽量抽时间把已经解决的问题更改成已解决。谢谢版主!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马