值类型的变量赋值只是进行数据复制,创建一个同值的新对象,而引用类型变量赋值,仅仅是把对象的引用的指针赋值给变量,使它们共用一个内存地址。
值类型数据是在栈上分配内存空间,它的变量直接包含变量的实例,使用效率相对较高。而引用类型数据是分配在堆上,引用类型的变量通常包含一个指向实例的指针,变量通过指针来引用实例。
引用类型一般都具有继承性,但是值类型一般都是封装的,因此值类型不能作为其他任何类型的基类。
值类型变量的作用域主要是在栈上分配内存空间内,而引用类型变量作用域主要在分配的堆上。
我的理解(有错麻烦大家指正,谢谢!)
值类型:基本数据类型(int、double、boolean ...)
引用类型:reference类型,通过它可以直接或间接的查找到对象在java堆中数据存放的起始地址或索引(对象在java堆中的哪个位置)
一:基本变量的赋值
public void method() { int a = 1; int b = a; } 该方法的字节码: 0 iconst_1 // 将 int 型 1 推送至操作数栈栈顶 1 istore_1 // 将操作数栈栈顶 int 型值存入第二个本地变量 2 iload_1 // 将第二个int型本地变量推送至操作数栈顶 3 istore_2 // 将操作数栈栈顶 int 型值存入第三个本地变量 4 return // 方法返回
二:基本变量的赋值
public void method2() { Object a = new Object(); Object b = a; } 该方法的字节码: 0 new #15 <java/lang/Object> // 创建一个对象,并将其引用压入栈顶 3 dup // 复制栈顶引用类型数据并将其值压入栈顶 4 invokespecial #1 <java/lang/Object.<init>> // 执行对象构造方法(使用了栈顶引用类型) 7 astore_1 // 将操作数栈栈顶引用类型数据值存入第二个本地变量 a 8 aload_1 // 将第二个引用类型本地变量推送至栈顶 9 astore_2 // 将栈顶引用类型数值存入第三个本地变量b 10 return // 方法返回
再看选项
A(✔):值类型的和引用类型的变量赋值就像上面一样,先把局部变量表中 a 的数值存入操作数栈,再取出来放入 b,不过区别在于:
B(✔):
C(✔):类可以继承,基本数据类型不能继承