Java虽基于C++,但相比之下,Java是一种更加纯粹的面向对象程序设计语言。
在Java的世界里,几乎一切都是对象,而Java中的全部工作则是定义类,产生那些类的对象,以及发送消息给这些对象。
尽管一切皆称对象,但我们真正操纵的确是对象的引用,好比电视机为对象,遥控器则为引用,你若想在房间里边走边操控电视,只需带着遥控器这个引用,不必带着电视这个对象。另外,引用可以单独存在,并不需要有对象与之相关联。如创建String s,则创建了一个String引用,但此时如果向这个引用发送消息,就会返回错误,这是因为s并没有和任何对象相关联。因此,比较安全的做法是创建一个引用的同时便进行初始化。当在创建引用时,其实我们是迫切希望它能与一个新的对象相关联的,即对象的实例化。
本章重点:
1、程序运行时,具体内存分配情况分以下五种
1)寄存器:最快的存储区,位于处理器内部,数量有限,只能根据需求自动分配,不能加以控制,程序中看不到其任何迹象。(C、C++可以向编译器提供寄存器的分配方式)
2)栈:位于通用RAM(随机访问存储器),通过栈指针的上下移动实现内存的释放与分配。Java系统必须知道所有存储在栈中数据的生命周期,以便指针的上下移动。十分限制程序的灵活性。对象引用存在堆栈,而对象存在于堆中。
3)堆:也位于RAM,一种通用的内存池。用于存放所有的Java对象,堆不同于堆栈的好处在于堆不需要知道存储的数据的生命周期,大大提高了灵活性。代价:清除与存储分配需消耗更多的时间。
4)常量存储:常量值通常保存在程序的内部,但是再嵌入式系统中,常量本身回合其他部分分隔开,故选择保存在只读存储器中。
5)非RAM存储:如果数据完全存在于程序之外,那将不会受程序的任何控制,在程序没有运行时也可以存在。两个例子:流对象中将对象转化为字节流,发送到另一台机器;持久化对象中将对象存放于磁盘上。
2、基本类型所占存储空间的大小
各基本类型固定大小。不像大多数语言那样随着机器硬件架构的变化而变化,这种固定性是Java移植性好的重要原因。
3、永远不要销毁对象
Java中的垃圾回收器,时刻监视用new创建的所有对象,并辨别那些不会再被引用的对象,随后释放这些对象的空间,供新对象使用。
4、变量初始化
当变量作为类的数据成员时,Java会给定其默认值,确保其初始化,以防程序错误。而对于非类中成员的其他变量来说,并不会自动初始化,必须对其赋值。
5、static
通常来说,当创建类时,局势在描述那个类的对象的外观和行为。除非用new创建那个类的对象,否则实际上并未获得任何对象。只有在执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。还有两种情形是以上方法解决不了的,一种是只想为特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不用去创建任何对象。另一种情形是,希望某个方法不与包含它的类的任何对象产生关联。通过static关键字可解决这两种需要。当声明一个事物是static时,就意味着这个域或者方法不会被包含它的类的所有对象关联在一起。也就是说,即便没有创建这个类的任何对象,也可以调用这个static方法或者static域。
6、Java中堆和栈的区别
堆:主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存周期不需要提前确定。
栈:主要用于存放基本数据类型的变量以及对象的引用变量,变量出了作用域就会自动释放。栈的内存管理是通过栈的"后进先出"模式来实现的。存取速度快,大小和生存周期必须确定,缺乏灵活性。