在程序运行过程中,其值能被改变的量称为变量。在Java中,所有的变量必须声明才能使用,声明方式为:变量类型 变量名; int a; 或者 Person p; a 和 p 都为变量。
我们有一个Person类
class Person{
field;
construtor;
method;
}
Person p;
在栈内存中开辟一块空间给变量p , 此时变量p为null。
变量p 不是一个对象,它只是一个变量,此时p不能调用任何Person方法。要想使用方法我们必须使用构造器.我们通过构造器初始化这个变量。
p = new Person(); //通过关键字 new 创建出来的才是对象(这个叫抽象信息,需要你去理解)
new Person(); 在堆内存中开辟空间给Person类对象。
把对象在堆内存的地址给变量p。
这里的 = 不是赋值的意思,而是把地址传递给变量p。
注释:Java中就算你不去定义构造器也没事,因为有一个默认的构造器,如果你写一个带参数的构造器,那么默认构造器也要定义出来。
一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。(抽象信息,需要你去理解)
大家千万不要被引用这个词给误导了(绕晕了)!! 这里是动词
我们再举个例子
Person p1 = new Person();
Person p2 = p1;
Person p3= new Person();
System.out.println(p1 == p2); //true
System.out.println(p1 == p3); //false
任何对象变量的值都是对存储在另外一个地方的一个对象的引用,new操作符的返回值就是一个引用。 这里引用是名词我被困在这里好久,花了好久才想明白(放弃了),我果然脑子里装的全是浆糊
我们可以用比喻法来描述下: 对象就好比是一台电脑,刚刚生产出来时我们无法直接操作它吧, 引用呢就是鼠标和键盘 我们通过鼠标和键盘(引用)来操作电脑(对象) Good我真聪明
参考博文: 大家可以去看一下,讲的非常细致
链接: https://www.cnblogs.com/dudefu/p/7977717.html.
Person p = new Person();
我们首先在栈中创建一个变量 p 。
在堆中创建一个对象 new Person(); 然后把对象在堆内存中的地址给变量 p ,由此 变量 p 变成了 引用变量(对象的引用变量)。
引用变量就相当于是为数组或者对象起一个名称,以后就可以通过使用栈中的引用变量来访问堆中的对象。
我们在java中定义的基本类型变量,对象的引用变量都存放在栈中
栈有一个很重要的特性,存在栈中的数据可以共享。
那这时候肯定会问,什么是数据共享?
我们有三个变量 a,b,c 编译器会先在栈中创建变量a,然后查找堆中有没有1这个值,如果没有就创建(将1存入栈中),如果有就直接指向变量a,接着按此逻辑处理b,c. 如果这时候 c 指向了4 int c = 4;同样会执行什么的步骤,如果栈内存中有 4 就指向它,没有就创建。
注意变量只是分配了栈内存,并没有被分配内存空间
堆内存用来存放new创建的对象和数组。堆内存中所有的实体都有内存地址。
堆可以动态分配内存大小,Java的垃圾回收器会自动回收不再使用的数据(没有任何引用指向它)