回顾Java编程思想篇(一)
很久以前看过Java编程思想这本书,当时看得不是很懂,重新拿起这本书,感觉非常陌生,于是产生了重新研究的念头,并做一些读书笔记。
一、一切都是对象
1、Java与C++
说到面向对象语言,不得不提C++,C++可以说是最 早的一种面向对象语言,C++非常好的支持了面向对象编程的方法。但C++是一种混合型语言,也就是说允许多种编程方法,比如说面向对象编程方法、面向过程编程方法等。C++为了支持与C语言的向后兼容才成为混合型语言。
Java实际上也是一种混合型语言,但这种混合性并不像C++那么的重要,很少有人用Java语言来做面向过程的编程。因此在进入Java程序设计之前,必须把思想转换到面向对象的世界中来。
Java中一切都是对象。
2、用引用操纵对象
编程语言都要涉及到对内存中数据的操作,每种语言都有自己操纵内存中数据的方式。
在C++中,如果要处理数据可以使用指针的方式。而在Java中则是使用引用(reference)的方式。因为在Java中一切都视为对象,因此可以使用引用这个固定的方法来操纵数据。对这种情形举个例子:遥控器(引用)操纵电视机(对象)。只要有遥控器就可以保持与电视机的连接。当想改变电视机频道时,实际操控的是遥控器(引用),再由遥控器来调控电视机(对象)。还有即使没有电视机,遥控器也可以独立存在的,也就是说你有一个引用,并不一定需要一个对象与它关联。
比如创建一个String引用:
String s;
这里创建的只是引用,并不是对象。此时使用s就会出现运行时错误,因为s没有和实际的事物发生联系。
一种安全的做法,是在声明时就初始化。
String s = “abc”;
点击这里可以看一下Java引用与C++指针的区别。
3、创建对象
创建一个引用后就希望一个新对象与它相关联。创建对象通常用new操作符来实现。String s = new String(“abc”);
那么创建的对象存储到什么地方的呢?内存是怎么分配的呢?在Java中主要有五个地方存储数据:
1)、寄存器。位于处理器内部,是最快的存储区。程序员不能直接控制,它是根据程序的需求进行分配。
2)、堆栈。位于通用RAM(随机访问存储器)中。堆栈是一个先进后出的数据结构,堆栈指针向下移动,则分配新的内存;若向上移动则释放内存。在创建程序时,Java系统必须知道存在堆栈中的所有项的确切生命周期,以便上下移动堆栈指针。在堆栈当中存储的是对象的引用和基本类型(primitive types)。
3)、堆。位于位于通用RAM中,用于存放所有Java对象。堆不同于堆栈的好处:编译器不需要知道存储的数据在堆里的生命周期。在堆里的分配有很大的灵活性。
4)、常量存储。常量值直接放在程序的内部。
5)、非RAM存储。如果数据在程序没有运行时也可以存在的话,就可以使用流对象和持久化对象了。
3.1、特例:基本类型(primitive types)
Java的数据类型有两种:
一种是基本类型,共有8种,即int, short, long, byte, float, double, boolean, char(注意,并没有string的基本类型)。这种类型的定义是通过形如int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是,自动变量保存的是字面值,不是类的实例,也就是说不是类的引用,这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。
另一种是包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。
堆和堆栈的区别:
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。(未完待续)