读书笔记 JAVA编程思想 第二章 一切都是对象

JAVA 语言假设我们只面向对象的程序设计,而C++是一种杂合型语言

2.1 用引用操纵对象

JAVA 一切都被视为对象,采用固定的语法,操纵的标识符其实是一个引用。也可以单独的创建一个引用:

String s

此时创建的只是引用而不是对象。如果试图向s 发送消息,就会出错,因为s 没有与任何事物关联。保险的做法是创建引用的同时初始化:

String s=“ss”

2.2 必须由你创建所有的对象      (Spring解决了这个问题)

五个地方存储数据

1 寄存器不能直接控制,通过本地方法

2 堆栈位于通用的ram 但是堆栈指针可以获取直接支持。创建程序JAVA 必须知道堆栈中的确切生命周期,对象的引用存储在堆栈中。

3 通用内存池 也位于ram 用于存放所有JAVA对象,不需要知道生命周期,会自动进行内存分配,但是需要更多时间。 new 写出的代码,都会在堆中进行存储的分配。

4 常量存储通常在程序代码内部,在嵌入式系统,也会放在rom。

5 非ram 存储:如果数据存活于程序之外,就可以不受程序控制。把对象转化成可以存放在其他媒介的事物,基于ram的对象,java 提供了 轻量级的持久化支持

2.2.2 特例:基本类型

这些可以想象为“基本”类型,new 是将对象存储在堆里面,如果总是需要创建对象,特别是小的,简单的对象,并不是特别的有效。Java 中 采用和C++相同的方法。不是用new 来创建对象,而是创建一个并非是引用的“自动”变量,这个变量直接存储“值”,并置于堆中。

Java 要确定每一种基本类型大小,并且不随机器的硬件变化而变化。所以Java 更具可移植性的原因之一

Boolean 所占存储空间的大型没有明确知道,仅定义为字面值 true and false

1. boolean 类型被编译成 int 类型来使用,占 4 个 byte 。 

2. boolean 数组被编译成 byte 数组类型,每个 boolean 数组成员占 1 个 byte 。 

3. 在 Java 虚拟机里,1 表示 true ,0 表示 false 。 

4. 可以肯定的是,不会是 1 个 bit 。 

5. boolean只是包含了一个bit大小的信息,在不同情况下实际转化成的大小不一样。

高精度数字  包装器类

BigInteger   支持任意精度的整数

BigDecimal 支持任意精度的定点数

2.2.3 JAVA 数组

C++ 数组就是内存块,访问自身内存块之外的数组很危险。

JAVA主要目标之一是安全性 确保数组初始化,而且不能再它之外访问。这是以数组的内存开销以及运行时的下标检查为代价。

创建数组,实际上是创建一个引用数组,每个引用都会自动的初始化一个特定的值。 该值拥有自己的关键字null,JAVA 看到null,就知道这个对象还没有引用对象,必须制定对象。 如果直接使用null的引用,运行时会报错

2.3 不需要销毁对象

Java 如何销毁对象,变量的生命周期混乱往往会导致大量的bug

2.3.1 作用域(scope)

作用域决定了其定义的变量名的可见性生命周期。

作用域里面的定义的变量只可用于作用域结束之前。

C++ 可以这样来隐藏大作用域里面的变量,但是 Java 不可以。会导致程序混乱。

2.3.2 对象的作用域

New 创建了一个对象时,他可以存活在作用域之外,s指向的String对象仍然占据内存空间。虽然无法在域外访问这个对象,因为唯一的引用已经超出了作用域的范围。所以由new 创建的对象只要需要就一直保持(永久代JVM)

2.4 创建新的数据类型:类

如果创建一个新的类型,class 后面紧跟新的类型的名称

class NewTypeName;

2.4.1 字段(数据成员)和方法

一旦定义的一个类,就可以在类中设置两种类型的元素:字段和方法

字段可以是任何类型的对象。如果是某个个对象的引用,必须进行初始化;

普通的字段不能在对象间共享

如果是基本的成员变量,即便没有初始化JAVA 也会确保一个默认值,但是不适用于局部变量。

猜你喜欢

转载自www.cnblogs.com/frank-QAQ/p/9777415.html