两个对象引用进行比较,比较的是这两个对象的引用,而引用是在内存中的一个地址。当然在这之前我们一定要清楚引用数据类型的堆栈二段式内存管理模式。下面通过一个例子来掩饰引用间的比较。
public class Obj {
public static void main(String [] args)
{
Obj t1=new Obj();
Obj t2=new Obj();
if(t1.equals(t2))
{System.out.println("true");
}
else
{
System.out.println("false");
}
}
}
运行结果为: false
equals方法在这里比较的是对象的引用,用new关键字创建的对象地址是重新分配的,它们进行比较地址当然是不同的。
下面对上面的程序进行扩展:
public class Obj {
public String name;
public int age;
public void say(){
System.out.println("姓名:"+name+" 年龄:"+age);
}
public static void main(String [] args)
{
Obj t1=new Obj();
Obj t2=new Obj();
Obj t3=new Obj();
t3=t1;
if(t1.equals(t2))
{System.out.println("true");
}
else
{
System.out.println("false");
}
t1.name="Tiny";
t1.age=20;
t1.say();
t2.name="SK";
t2.age=10;
t1.say();
t2.say();
t1=t2;
if(t1.equals(t3))
{System.out.println("true");
}
else
{
System.out.println("false");
}
t1.say();
t2.say();
t3.say();
if(t3.equals(t2))
{System.out.println("true");
}
else
{
System.out.println("false");
}
}
}
运行结果如图:
有关程序的具体执行,通过图例演示,如下:
Obj t1=new Obj();
Obj t2=new Obj();
Obj t3=new Obj();
创建Obj类的实例,在内存中开辟存储空间。
当执行t3=t1;时,内存中存储形式变为:
原来t3所指向的那块堆内存将变为“垃圾”。由java垃圾回收机制自动回收。
if(t1.equals(t2))
{···· }
else
{···· }输出结果当然为 false了。
t1.name="Tiny";
t1.age=20;
t1.say();
t2.name="SK";
t2.age=10;
t1.say();
t2.say();
执行完这几条语句后,内存结果为:
至于t1.say();和t2.say();这两条语句的结果我就不用多说了吧,下面是关键部分,当执行t1=t2;后内存中存储结果为:
最后执行的那几步应该就很清晰了,整个程序的流程到此结束。 |
| |