Java编程思想 Thinking in Java 学习笔记——第2章 一切都是对象
Java编程思想学习笔记——第2章 一切都是对象
- 2.1 用引用操纵对象
- 2.2 必须由你创建所有对象
- 2.2.1 存储到什么地方
- 2.2.2 特例:基本类型
- 2.2.3 Java中的数组
- 2.3 永远不需要销毁对象
- 2.3.1 作用域
- 2.3.2 对象的作用域
- 2.4 创建新的数据类型:类
- 2.5 方法、参数和返回值
- 2.6构建一个Java程序
- 2.6.3 static关键字
- 2.7 你的第一个Java程序
- 2.8 注释和嵌入式文档
- 2.8.1 注释文档
- 2.8.2 语法
- 2.9 编码风格
2.1 用引用操纵对象
每种编程语言都有自己的语法规则去操纵内存中的对象。比如说C,C++是通过指针这种简介方式来操纵对象。
在Java中,一切都是对象。操纵的标识符其实是对象的引用(reference)。
引用像遥控器,对象是电视机。有遥控器(引用)就可以保持与电视机(对象)的联系。
String s;
这只是定义了一个引用,如果向s发送消息,就会报一个运行时错误,因为s没有与任何事物相关联。安全的做法是,创建一个引用的同时并对它初始化。
String s=“abcd”;
2.2 必须由你创建所有对象
2.2.1 存储到什么地方
寄存器:这是最快的存储区。位于处理器内部。
堆栈:位于通用RAM(随机访问存储器)中,可以通过堆栈指针直接访问。速率仅次于存储器。
栈:一种通用内存池,也位于RAM(随机访问存储器)。堆不同于堆栈的好处是——编译器不需要知道存储的数据(new出来的)在堆里存活的时间。
常量存储:直接存放在程序代码内部,在ROM(只读存储器)中。
非RAM存储:
流对象:一个机器发给另一个机器的字节流。
持久化对象:对象被存放在磁盘上。
2.2.2 特例:基本类型
new一个简单变量,存储在堆,不高效。
Java采取与c、c++相同的方法,不用new来创建变量,而是创建一个并非是引用的“自动”变量。这个变量直接存储“值”,并置于堆栈中,更高效。
BigInteger支持任意精度的整数。
BigDecimal支持任何精度的定点数。
2.2.3 Java中的数组
C、C++中的数组就是内存块,可能会有访问内存块外的数组或数组初始化前使用内存,都会产生难以预料的后果。
Java的主要目标之一是安全。Java确保数组初始化,而不不能在它的范围之外被访问。这种范围检查,是以每个数组上少量的内存开销及运行时的下标检查为代价的。由此换来安全性和效率的提高。
创建一个数组对象,就是创建一个引用数组,并且每个引用都会被自动初始化为一个特定值,拥有自己的关键字null,一旦java看到null,就知道这个引用还没有指向某个对象。在使用引用前,要指定对象,否则运行时会报错。
2.3 永远不需要销毁对象
2.3.1 作用域
在C、C++、Java中,作用域由花括号的位置决定。
在Java中,空格、制表符、换行都不会影响程序的执行结果。
2.3.2 对象的作用域
Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,它可以存活于作用域之外。
例如:
{
String s= new String(“a string”);
}//End of scope
引用s在作用域终点就消息了。然而,s指向的String对象仍继续占据内存空间。作用域之后无法访问这个对象。
Java有一个垃圾回收器,用来监视new创建的所有对象,并辨别那些不会再被引用的对象,并释放这些对象的内存空间,以便其他新的对象使用。
有一个问题:
java中有垃圾回收器,能监视new创建的所有对象,并辨别那些不会被引用的对象。随后,释放这些对象的内存空间,以便使其他新的对象使用。那为什么会有java heap泄漏呢?
Java中的内存泄漏(Java Heap Leak)与C/C++中的内存泄漏在表现上相同(最终都会导致OutOfMemoryError),但成因完全不同。
C/C++中的内存泄漏是程序员显式分配了内存(malloc或new)后,完全丢失了该内存的地址,导致无法再访问也无法释放它。
而Java中的内存泄漏,更准确的描述是:“无用的对象仍然被意外地引用着”(Unintentional Object Retention)。
垃圾回收器只会回收那些不可达(Unreachable) 的对象。如果一个对象虽然程序以后永远不会再使用它,但由于编码错误,它仍然被一个有效的引用链(Reference Chain)所连接,GC就无法回收它。这种对象的累积就会导致内存泄漏,最终耗尽堆内存。
2.4 创建新的数据类型:类
字段:数据成员
方法:成员函数
字段可以是任意类型的对象。
字段如果是某个类型的引用,必须初始化该引用,以便与一个实际对象相关联。
字段如果是基本数据类型,即使没有初始化,Java也会确保它获得一个默认值。
boolean-》false
char-》‘\uooo’(null)
byte->0
short->0
int->0
long->0L
float->0.0f
double->0.0d
如果是局部变量例如 int x; x值不会被初始化为零。Java会在编译时,返回一个错误,告知变量没有初始化,这是优于C++的地方。
2.5 方法、参数和返回值
许多程序设计语言(像C、C++),用函数这个术语来描述命名子程序,而在Java里却常用方法这个术语来表示“做某些事情的方式”。
方法的基本构成是名称、参数、函数体、返回值。
方法只有通过对象才能调用。
2.6构建一个Java程序
2.6.3 static关键字
定义类只是描述类的属性和行为。new创建对象时,数据存储空间才被分配,方法才供外界调用。
新的情形:
1)只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象。
2)希望某个方法不与包含它的类的任何对象关联在一起
此时用static关键字。
Class Mytest{
static int i=19;
}
Mytest m1=new Mytest();
引用static变量有两种方法。通过对象,m1.i;
或者类名直接引用,Mytest.i;
Class Lei(){
static void incre(){
Mytest.i++;
}
}
Lei mylei=new Lei();
mylei.incre();
或者
Lei.incre();
2.7 你的第一个Java程序
2.8 注释和嵌入式文档
注释方式有两种
当行//
多行/* */
2.8.1 注释文档
2.8.2 语法
2.9 编码风格
类名首字母大写。
类名多个字母,首字母都大写。
方法,对象首字母小写。
Class AllTheColor{
int anIntegerRepresent;
void changeTheHun;
}