【Java编程思想】2.一切都是对象
2.1 用引用操作对象
Java 中一切都被视为对象。但是操纵对象的标识符实际上是对象的一个引用(reference)。
String s; // 创建一个 String 的引用
如果此时向 s 发送一个消息,就会返回一个“运行时错误”。因为此时 s 没有与对象关联。
安全的做法,是创建一个引用的同事就对其进行初始化
2.2 必须由你创建所有对象
创建一个引用,就是与一个新的对象进行关联(通常用关键字“new”实现)。
对象的存储:
- 寄存器:处理器内部,不能直接控制。
- 堆栈:维语通用 RAM 中,通过“堆栈指针”从 CPU 获得直接支持。
堆栈指针向上移动,释放内存;向下移动,分配内存。
虽然某些 Java 数据存储于堆栈(特别是引用)但是对象不在其中。 - 堆:一种通用的内存池(位于 RAM 区),用于存放所有 Java 对象。
与堆栈不同,编译器不需要知道存储的数据在堆中存活的时间。在 new 一个对象时,会自动在堆中进行分配。
但用堆进行存储分配和清理“可能”比用堆栈更费时(实际上 Java 不能直接操作堆栈存储对象)。 - 常量存储:常量通常直接存储在程序代码内部。嵌入式系统中常量本身会和其他部分隔开。
- 非 RAM 存储:不受程序控制,在程序不运行时也可以存在。
- 流对象:对象被转化为字节流,通常被发送给龙一台机器。
- 持久化对象:对象被存放在磁盘上。
Java 中基本类型特殊之处:
在创建一个基本类型的变量时,并不使用 new,而是创建一个“并非是引用”的“自动”变量,这个变量直接存储值,并存在于堆栈中。
因为这种特殊,Java 确定了基本类型所占存储空间的大小,且大小不会随机器硬件架构变化而变化-->这就为 Java 程序带来了优秀的可移植性。
boolean,char,byte,short,int,long,float,double,void
基本类型中所有数值类型都有正负号。
基本类型具有包装器类,使得可以在“堆”中创建一个非基本类型对象-->装箱
高精度数:BigInteger 和 BigDecimal,大体上属于“包装器类”的范畴,但是二者没有对应的基本类型。
这两种类包含的方法,提供的操作与基本类型所能执行的操作类似。
Java 中会确保数组呗初始化,且不会在他的范围之外被访问-->这样就以少量的内存开销以及运行时的下表检查为待见,确保了安全性以及效率。
- 当创建一个数组对象时,实际是创建了一个引用数组,且每个引用都会自动初始化为一个特定值(基本类型为0/false,其他为 null)。
- 一旦 Java 看到 null,就表示该引用还为指向某个对象。
2.3 永远不要销毁对象
作用域决定了在其内定义的变量名的可见性和生命周期。Java 的作用域就定义在{}
之内。
使用 new 创建了一个 Java 对象时,他可以存活于作用域之外。
垃圾回收器(GC)会监视 new 创建的对象,辨别不会再被引用的对象,随后释放这些对象的内存空间。-->一定程度上解决了内存泄漏问题。
2.4 创建新的数据类型:类
类:class 实际上定义了对象的类型/外观/行为。包含更多可能性的一种新的数据类型。
在定义了一个类之后,我们就可以使用 new 创建这种“类型”的“对象”。
Java 中,所需要做的全部工作就是定义类,产生类的对象,发送消息给这些对象。
类中可以设置:
- 字段(数据成员)-->可以使任意对象-->如果是某对象的引用,则必须初始化(字段的赋值:
objectRefernce.member
)。 - 方法(成员函数)
类中的字段是基本数据类型时,即使未进行初始化,Java 也会确保其获取一个默认值(此种方法对程序来说是不合法的,所以尽量要主动对其进行初始化)
2.5 方法,参数和返回值
Java 中的方法由名称,参数,返回值,方法体构成。
方法名称和某参数是唯一标识出方法的因素.
调用方法也可以称为“发送消息给对象”。
在 Java 中传递对象参数时,实际传递的也是对象的引用(基本类型是例外)。
return 关键字代表的是:
- 已经做完,离开此方法
- 方法的结果值要放在 return 后
- 对 void 的返回类型,return 只是用来退出方法
除了 void,编译器会强制返回正确的返回值
2.6 构建一个 Java 程序
Java 中使用倒写域名的规范,避免同名混淆;保证文件自动存活在自己的命名空间(namespace)内,统一文件内每个类都有唯一的标识符。
Java 中使用 import 关键字,来准确告诉编译器需要的类。import 可以只是编译器导入一个类/包/类库。
使用通配符*来到如一个包下的全部类。
static 关键字用来满足:
- 只想为特定域分配单一的存储空间,而不去考虑要创建多少对象。
- 希望某个方法不与包含它的类的任何对象关联在一起,即使没有创建任何对象,也能调用这个方法。
- 这也意味着,非 static 域或方法必须与某一个特定对象关联。
Class StaticTest {
static int i = 47; // 即使创建 n 个 StaticTest 对象,StaticTest.i 也只有一份存储空间
}
静态参数可以直接引用,同理,静态方法也可以直接进行引用。
综上:
- static 字段对每个类都只有一份存储空间。
- 非 static 字段对每个类都有不同的存储空间。
- static 会改变数据的创建方式。
java.lang 默认导入到每个 Java 文件中(其下的所有类可以被直接使用)。
main() 方法的参数是 String 对象的数组,其中 args 要用来存储命令行参数。
javadoc 是 JDK 自带的提取注释的工具。
- 独立文档标签@,且要置于注释行的最前面
- 行内文档标签{},可以出现在注释中的任何地方
javadoc 只能为 public/protected 成员进行文档注释