看完这篇文章,我终于理解了变量、对象、引用

变量、对象、引用

变量

在程序运行过程中,其值能被改变的量称为变量。在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 创建出来的才是对象(这个叫抽象信息,需要你去理解)
  1. new Person(); 在堆内存中开辟空间给Person类对象。

  2. 把对象在堆内存的地址给变量p。

  3. 这里的 = 不是赋值的意思,而是把地址传递给变量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

看完这篇文章,我终于理解了变量、对象、引用_第1张图片

任何对象变量的值都是对存储在另外一个地方的一个对象的引用,new操作符的返回值就是一个引用。 这里引用是名词我被困在这里好久,花了好久才想明白(放弃了),我果然脑子里装的全是浆糊

我们可以用比喻法来描述下: 对象就好比是一台电脑,刚刚生产出来时我们无法直接操作它吧, 引用呢就是鼠标和键盘 我们通过鼠标和键盘(引用)来操作电脑(对象) Good我真聪明

参考博文: 大家可以去看一下,讲的非常细致
链接: https://www.cnblogs.com/dudefu/p/7977717.html.

结合栈堆来讲

Person p = new Person();

我们首先在栈中创建一个变量 p 。

在堆中创建一个对象 new Person(); 然后把对象在堆内存中的地址给变量 p ,由此 变量 p 变成了 引用变量(对象的引用变量)。

引用变量就相当于是为数组或者对象起一个名称,以后就可以通过使用栈中的引用变量来访问堆中的对象。

栈:

我们在java中定义的基本类型变量,对象的引用变量都存放在栈中

​ 栈有一个很重要的特性,存在栈中的数据可以共享。

那这时候肯定会问,什么是数据共享?

看完这篇文章,我终于理解了变量、对象、引用_第2张图片
我们有三个变量 a,b,c 编译器会先在栈中创建变量a,然后查找堆中有没有1这个值,如果没有就创建(将1存入栈中),如果有就直接指向变量a,接着按此逻辑处理b,c. 如果这时候 c 指向了4 int c = 4;同样会执行什么的步骤,如果栈内存中有 4 就指向它,没有就创建。

注意变量只是分配了栈内存,并没有被分配内存空间

堆:

堆内存用来存放new创建的对象和数组。堆内存中所有的实体都有内存地址。

堆可以动态分配内存大小,Java的垃圾回收器会自动回收不再使用的数据(没有任何引用指向它)

你可能感兴趣的:(java,内存管理)