以下纯属个人的理解,如果有不全或者错误的地方,欢迎大家批评指正。
初学 Java 的时候,博主很容易将两者混淆在一起,这里就做个简单的区分。
为了方便说明,博主先创建一个 People 类(类是具有相同属性和行为的一类实体,对象是类的实例化)
public class People {
private String name;
private int age;
public People(String name,int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
具体的类有了,下面我们来实例化 People 类,代码如下:
public class ObjTest {
public static void main(String[] args) {
People zhh = new People("赵海豪", 23);
}
}
看似是一行简单的代码,我们把这一行简单的代码做拆分,大概是以下这个样子:
People zhh;
zhh = new People("赵海豪", 23);
- 先来说明下 People zhh 这一小段代码的作用:Java虚拟机为其分配了一块栈空间。这里主要是声明了一个引用变量 zhh (也就是我们的对象引用),对应的类型为 People 。打个比方,我起了个绰号叫 zhh ,我们只知道有 zhh 这个绰号存在,但是我们并不知道它具体指的是哪个人。这个绰号就可以理解为是对象引用。
- 再来说下 new People("赵海豪", 23) 这段代码:这里的话Java虚拟机为其分配的不再是栈空间了,而是分配的堆空间。在这里主要是实例化了一个具体的对象。换句话说,就是现在有一个这样的人,他的名字叫 赵海豪,今年 23 岁。这个具体的人就可以理解为是对象。
- 最后再来说说这个"=":在Java虚拟机当中,并不是将我们的引用对象直接提供给变量(对象引用)的,而是将引用对象存在堆中的地址提供给变量,然后变量再通过这个对象的地址去堆内查找我们的引用对象。其实也就是将我们的对象引用指向我们的对象。换句话也就是说,我给这个名字叫 赵海豪,今年 23 岁的小伙子起了 zhh 这样的一个绰号,现在 zhh 就是指他这个人。
忽略中间其余的过程,我简单给出上述代码在堆栈中的引用关系图: