Java是存粹的面向对象语言,一切都是对象。
Java内存分配方式
在Java内部,总共有这么几种储存数据的地方:
寄存器,堆栈,栈,常量存储区,磁盘。(寄存器>堆栈>栈)
寄存器
寄存器读写读写速度最快,有以下几种特点:
- 无法通过程序控制。
- 对程序员来说是透明的。
堆栈
读写速度仅次于寄存器,位于RAM(通用随机存储器)中,用于存储引用
。
- 堆栈指针上(下)移动,释放(分配)内存。
- 存储在堆栈内的数据有确定的生命周期,以便堆栈指针上下移动,进行内存的管理
基于引用的特性,Java可以准确的知道何时为某个引用分配内存,何时可以释放该引用。
堆
堆
,用于存储对象
,位于RAM中,读写速度次于堆栈
,但是在内存分配上,比堆栈
灵活,其代价就是,用堆
进行内存存储分配和清理要比堆栈
慢。
- 分配内存较为灵活
- 无需知道堆内数据的生命周期
堆的特性适合存储对象
,每一次进行new
操作,都会产生一个对象,同一个类可以有无数个对象,因此,一个灵活分配内存的容器是至关重要的。
但不是全部的对象都存储在堆中,在java中一切皆为对象,对于Java的基本数据类型,其对象的分配如果用
new
的话,显得并不是特别高效。于是Java定义基本数据类型的对象储存在堆栈
中,不用new
处理基本数据类型。
常量存储区
常量存储区,位于ROM(只读存储区)中,用于存储常量。
非ROM存储
类似与磁盘,硬盘等存储。位于该处的数据与程序的运行状态无关,无论程序是否启动或和关闭,数据都可以保持自己的状态。
引用(reference
)与对象
Java中一切皆对象,引用
类似于handle
,是用于管理对象的工具。1
String s;
上面的例子就定义了一个引用,但是改引用还未初始化,默认为NULL
1 | String s = "Hello World"; |
上面的例子,将引用s指向一个字符串,于是,我们可以通过引用来对对象进行操作。
销毁机制
每个引用都有自己的生命周期,可通过Java的作用域(scope
)机制确定。
当引用“死去”后,其指向的对象不一定会,同时被销毁,可能会保留到程序执行结束,这些没有引用指向的对象,由Java的垃圾回收器
来管理,我们无需操心,这也是Java的神奇之处。
static静态方法与静态属性
利用关键字static
来进行声明。其又称作类方法
,类数据
。主要有以下特点:
- 无需利用
new
来为其创建内存,在程序运行时,Java会自动为其分配空间 - 无需声明一个对象就可以进行调用(通过类名来调用)。
- 无论为某个类声明多少对象,其内部的类方法,类属性都只有一个存储空间
1 | public static void main(String args[]){ |
main
函数就是一个典型的静态方法,做为一个程序的一个入口使用。