深入分析Java中的 == 和equals

关于Java中的 == 和equals的解释请看这位博主的文章 :http://www.cnblogs.com/dolphin0520/p/3592500.html

以下是我对这篇文章的一些扩展。

对创建实例过程的理解:

public static void main(String[] args) {
Human man = new Man();
Human woman = new Woman(); }

  这是这段代码的部分截图:

深入分析Java中的 == 和equals

由图可知,Human man = new Man()这条语句对应的四个指令为

1.new,创建一个Man类型的对象(Man为StaticDispath的静态内部类),并对对象进行默认初始化,并将该对象的引用压入栈顶;

2.dup,复制栈顶数值并将复制值压入栈顶(也就是说,栈顶有两个该实例的引用)

3.invokespecial,调用实例的构造器方法,这个过程会将栈顶的实例的this引用,传给构造器方法(栈顶的实例的引用消耗了一个)

4.astore_1,栈顶的实例的引用出栈,存储在局部变量表中,以便后续访问(两个引用刚好用完了),局部变量表中存储的就是引用变量的值。

如果将代码写成这样的形式:

 public static void main(String[] args) {
Human man;//声明一个引用变量
man = new Man();
}

反汇编后得到的字节码与上面的相同。但是如果只声明变量,不复制,也就是将man = new Man();注释掉,发现反汇编后,局部变量表没有对应的man引用变量。

深入分析Java中的 == 和equals

上一篇:Java Persistence with MyBatis 3(中文版)


下一篇:Windows 程序设计