【Java编程思想】2.一切都是对象

2.1 用引用操作对象

Java 中一切都被视为对象。但是操纵对象的标识符实际上是对象的一个引用(reference)。

String s; // 创建一个 String 的引用

如果此时向 s 发送一个消息,就会返回一个“运行时错误”。因为此时 s 没有与对象关联。
安全的做法,是创建一个引用的同事就对其进行初始化


2.2 必须由你创建所有对象

创建一个引用,就是与一个新的对象进行关联(通常用关键字“new”实现)。

对象的存储:

  1. 寄存器:处理器内部,不能直接控制。
  2. 堆栈:维语通用 RAM 中,通过“堆栈指针”从 CPU 获得直接支持。
    堆栈指针向上移动,释放内存;向下移动,分配内存。
    虽然某些 Java 数据存储于堆栈(特别是引用)但是对象不在其中。
  3. 堆:一种通用的内存池(位于 RAM 区),用于存放所有 Java 对象。
    与堆栈不同,编译器不需要知道存储的数据在堆中存活的时间。在 new 一个对象时,会自动在堆中进行分配。
    但用堆进行存储分配和清理“可能”比用堆栈更费时(实际上 Java 不能直接操作堆栈存储对象)。
  4. 常量存储:常量通常直接存储在程序代码内部。嵌入式系统中常量本身会和其他部分隔开。
  5. 非 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 关键字用来满足:

  1. 只想为特定域分配单一的存储空间,而不去考虑要创建多少对象。
  2. 希望某个方法不与包含它的类的任何对象关联在一起,即使没有创建任何对象,也能调用这个方法。
  3. 这也意味着,非 static 域或方法必须与某一个特定对象关联。
Class StaticTest {
    static int i = 47; // 即使创建 n 个 StaticTest 对象,StaticTest.i 也只有一份存储空间
}

静态参数可以直接引用,同理,静态方法也可以直接进行引用。

综上:

  1. static 字段对每个类都只有一份存储空间。
  2. 非 static 字段对每个类都有不同的存储空间。
  3. static 会改变数据的创建方式。

java.lang 默认导入到每个 Java 文件中(其下的所有类可以被直接使用)。

main() 方法的参数是 String 对象的数组,其中 args 要用来存储命令行参数。


javadoc 是 JDK 自带的提取注释的工具。

  • 独立文档标签@,且要置于注释行的最前面
  • 行内文档标签{},可以出现在注释中的任何地方

javadoc 只能为 public/protected 成员进行文档注释

posted @ 2018-10-15 16:25  chentnt  阅读(170)  评论(1编辑  收藏  举报