深入分析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();
		
}

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

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

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

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/gulingjingguai/p/8178194.html