对象与对象引用
1. 创建对象
new Person(); //对象分配在堆上
2. 声明一个对象引用
Person p;
//在栈空间上开辟一段内存空间分配给变量p
//p称为引用变量,它的值是一个地址,类型是对象类型
//他是一个引用变量
3. 初始化对象引用
p = new Person();
(以上图片为截图,fp
相当于 p
,FighterPlane
相当于 Person
)
-
在堆上为该对象开辟空间,并将对象的首地址赋值给
p
,因此将创建的该对象与变量p
关联 -
变量
p
在栈中实际存储的是对象的地址值
4. 对象与对象的引用的区别
- 一个对象引用变量占据4个字节空间
- 一个对象至少占据16个字节,其中包含12字节的对象头信息。除此之外,还有对象的属性变量和方法,对其填充字节
5. 对象作为参数传递的特点
对象是引用传递,基本数据类型是按值传递
public class ValuePass {
private static int a;
public static void main(String [] args) {
modify(a);
System.out.println(a);
}
public static void modify(int a) {
a++;
}
}
//0
上述例子中,a++
是对函数 modify
中的局部变量(形参)进行运算,而非类的静态变量,此a非彼a!
对象作为参数传递时,传的是地址值
class IntClass {
int value;
}
public class RunIntClass {
public static void modifyValue(IntClass s, int val){
s.value = val;
}
public static void main(String[] args) {
IntClass a = new IntClass();
modifyValue(a,8);
System.out.println(a.value);
}
}
//8
上述例子中,将 a
传给 s
时,本质是将栈中的地址值传递过去,相当于是按引用传递。就是对象引用 a 、s
相等,假如 a
的地址值是 0x001,那么 s
的地址值也是 0x001,他俩指向的都是堆中同一个内存空间,相当于一块内存有多个名字,就好比我们有大名,有小名,叫那个名字都是你。