private Res r;//这里不是很明白。Res r与Res r = new Res();有何区别?
Input(Res r)
{
this.r = r;
}
public void run()
{
int x = 0;
while (true)
{
synchronized(r)
{
if (x == 0)
{
r.name = "mike";
r.sex = "man";
}
else
{
r.name = "丽丽";
r.sex = "女女女女女女";
}
x = (x + 1)%2;
}
}
}
}
class Output implements Runnable
{
private Res r ;
Output(Res r)
{
this.r = r;
}
public void run()
{
while (true)
{
synchronized(r)
{
System.out.println(r.name+"..."+r.sex);
}
}
}
}
class InputOutputDemo
{
public static void main(String[] args)
{
Res r = new Res();
Input in = new Input(r);
Output out = new Output(r);
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
t1.start();
t2.start();
}
}
复制代码
private Res r;//这里不是很明白。Res r与Res r = new Res();有何区别?这到底有没有创建对象? 作者: xuluheng718 时间: 2013-5-5 09:53 本帖最后由 xuluheng718 于 2013-5-5 09:59 编辑
Res r是声明一个Res的对象r,但是没有初始化,也就是说r还没有任何堆内存的地址指向
Res r = new Res(); 这是声明一个Res对象并且实现了初始化,这里的r在栈内存中指向了Res()的堆内存地址作者: 曹德君 时间: 2013-5-5 10:24
Res r = new Res();是创建资源。input类在创建初始化的时候把Res这个类作为资源,
通过构造函数
Input(Res r)
{
this.r = r;
}。
传递给input这个类里面。意义是不一样的。作者: 胡帅冰 时间: 2013-5-5 10:31
Res r = new Res() ;这才是真的创建对象。使用Res r = new Res();语句在堆内存中创建对象,然后用 Input in = new Input(r);将创建的对象的地址传递给Input类中的private Res r 这个变量。相当于Input中的r变量有了一个对象的引用。也就可以使用Res r = new Res();创建的对象的资源了。作者: 吴文彬 时间: 2013-5-5 10:45
Res r是声明一个Res的对象引用类型的r,但是没有指向任何实际对象,也就是说r还没有指向堆内存的对象。打个比方,相当于代词‘他’,这个它没有指向任何人的那个状态。但是‘他’这个代词(相当于这里的r)可以用来指向任何人,只是现在没有指向任何人而已。
Res r = new Res(); 这是声明一个Res对象引用r, 并且指向了在栈内存中新创建的一个实际对象。(至于指向是什么意思,就是r这个变量存的是这个新创建对象的地址)
此时,通俗的讲,还是那个代词'他',此时这个代词指向实际的一个人,这个'他' 可以代表任何人,就像你可以叫任何人'他'。道理是一样的。作者: 郭军亮 时间: 2013-5-5 10:50
Res r 只是在栈中声明了一个res类的变量,而Res r = new Res() 是在栈中声明了一个reg类的r变量后,又在堆内存中开辟了一个reg类的对象的空间,这才是创建了一个真实存在的对象,然后把这个对象的内存地址赋给栈内存中的r。作者: 刘学明 时间: 2013-5-5 10:50
private Res r ; //这个没有创建对象 仅仅是声明了一个引用 还没有初始化 。