首页 > 代码库 > Java学习笔记一:对象与存储

Java学习笔记一:对象与存储

1.用引用来操作对象

Java是面向对象的编程语言,一切都能看作是对象,通过引用来完成对对象的操作。

// String 是对象,而s对指向这个String对象的引用String s;

注意:我们是通过对象的引用来操纵对象数据的,如果对象没有关联数据(如没有被初始化),则会出现空引用,报空指针异常:java.lang.NullPointerException

2.数据存储

(1)寄存器:位于CPU内部,是处理最快的区域,但是存储空间有限。Java不能通过程序直接控制。

(2)堆栈:位于RAM(随机访问存储器)中,通过堆栈指针从处理器获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放内存。仅次于寄存器的分配方式。

对于堆栈指针的移动,就要涉及到对象生命周期(简单理解是:堆栈指针移动,断开堆栈中引用的与对象的连接,此时对象就会被垃圾回收站回收)。

通常引用时存储在堆栈中,但是Java对象不存储在这里,而是存储在堆中。

 

Java的8中基本类型分别是:boolen,char,byte,short,int,long,float,double,这8种类型由于追求速度的原因,被存储在堆栈中。

例如:当定义 int a = 3 时,编译器会根据int类型在栈中分配固定的区域,来存储3这个字面值,同时创建a的引用,而a是指向存储3这个区域的引用(引用当然存储在栈中)

此时,如果在定义 int b = 3 时,首先会在栈中查找有没有这个字面量,找到后,把b的引用指向3,此时a,b都指向同一个区域。这就是栈一个重要特性:数据共享。

如果定义int c = 4,编译器内部无法找到4这个字面量,会重新给int分配空间存储,同时创建c的引用。

说明:这里的引用其实是栈中以4字节存储的地址,它存储的是其他区域的地址(类似于C++指针)。

image

(3)堆:位于RAM中,一种通用的内存池,存储所有的Java对象。堆与堆栈的区别:编译器不需要知道存储的数据在堆里存活的时间。使用new关键字,就能在堆中自动分配存储空间。

String类型也是常量存储。在Java中,创建一个对象通常包括两个步骤:1.对象声明(即创建对象引用);2.实例化(即为对象在堆中分配存储空间)。

创建过程与上述int类似,差别在于引用和对象不再同一块区域。

image

String s1; // 声明s1 = new String("abc"); // 实例化         String s3; // 声明s3 = new String("abc"); // 实例化         // 比较结果为true,这个是内容的比较System.out.println(s1.equals(s3));         // 比较结果为false,这个是引用的比较.因为引用位置不一样,结果肯定不一样System.out.println(s1== s3);

(4)常量存储:常量值通常存储在程序代码内部,用于存放字符串常量基本类型常量,一般使用 public static final 定义

(5)非RAM存储:通常值得是硬盘。两个基本的例子是:流对象持久化对象