苏木川のBlog

有关 Java 对象的理解

2021/07/09

基于《Java编程思想》(Thinking in Java Fourth Edition)整理,记录学习所获。阅读《Java编程思想》需要有一定编程基础,最好提前了解过一些有关C++编程的知识。


前言

尽管Java是基于C++的,但相比之下,Java是一种更“纯粹”的面向对象程序设计语言。

C++和Java都是混合/杂合型语言。杂合型语言允许多种编程风格;C++之所以成为一种杂合型语言主要是因为它支持与C语言的向后兼容,使C++在某些方面显得过于复杂。

用引用操作对象

在Java中,一切都被视为对象,操纵的标识符实际上是对象的一个引用(reference),Java中的引用在语法上更接近C++的引用而不是指针。创建一个String引用语法如下:

1
String str;

必须由你创建所有对象

上面所创建的只是引用,并不是对象,也就是说引用并不一定要和对象关联,可以独立存在,但在使用它的时候必须与特定对象关联,通常使用new操作符来实现这一目的:

1
2
String str;
str = new String();

或者我们也可以将上述两条语句合在一起写:

1
Sring str = new String();

存储到什么地方

  • 寄存器
    位于处理器内部,最快的存储区域,不能直接控制(C和C++允许向编译器建议寄存器分配方式)。
  • 堆栈
    位于RAM(随机访问存储器)中,是一种快速有效的存储分配方式,仅次于寄存器。某些Java数据特别是对象引用存储于堆栈中。Java必须知道存储在堆栈里所有项的确切生命周期,以便于上下移动堆栈指针。

  • 一种通用内存池(也位于RAM区域),用于存放所有Java对象,堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。
  • 常量存储
    常量值通常直接存放在程序代码内部。
  • 非RAM存储
    数据完全存活于程序之外,两个基本的例子是流对象持久化对象。把对象转化成可以存放在其他媒介上的事物,在需要时,可恢复成常规的、基于RAM的对象。

特例:基本类型

如int、char、double等基本数据类型不用new操作符创建变量,而是创建一个并非是引用的自动变量,这个变量直接存储“值”,并置于堆栈中,因此更加有效。Java每种基本类型所占存储空间是固定的,不像其他大多数程序设计语言那样随机器硬件架构的变化而变化
基本类型具有的包装器类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。
Java提供了两个用于高精度计算的类:BigInteger和BigDecimal,二者没有对应的基本类型。

Java中的数组

Java确保数组会被初始化,而且不能在它的范围之外被访问。当创建一个数组对象时,实际上创建了一个数组引用,并且每个引用都会被初始化为null,在使用之前,必须为其指定一个对象。创建的基本数组初始化全部置零。

永远不需要销毁的对象

Java有一个垃圾回收器,用来监视new创建的所有对象,并辨别那些不会再被引用的对象。随后吧,释放这些对象的内存空间,以便供其他新的对象使用。

创建新的数据类型

class关键字声明类:

1
2
3
class ATypeName{
/* Class body goes here */
}

字段和方法

  • 字段:数据成员
  • 方法:成员函数

引用一个对象的成员的方法为:在对象引用的名称后紧接着一个句点(.),然后再接着是对象内部的成员名称:

1
2
objectReference.member
objectReference1.objectReference2.member //objectReference2是objectReference1的成员

基本成员默认值

若类的某个成员是基本数据,即使没有初始化,Java也会确保它获得一个默认值(C++不具有此特性)。对于局部变量,Java则不会初始化为默认值,在使用局部变量前必须初始化,否则编译器会报错。

方法、参数和返回值

方法名和参数列表(它们合起来被称为“方法签名”)唯一的标识出某个方法。
Java中传递的参数是引用。

构建一个Java程序

名字可见性

为了给一个类库生成不会与其他名字混淆的名字,Java设计者采用反过来使用自己的Internet域名,可以保证独一无二,句点就用来代表子目录的划分。

运用其他构件

Java使用关键字import指示编译器导入一个包,例如:

1
2
import java.util.ArrayList;
import java.util.*; //使用通配符导入导入多个类

java.lang会自动导入到所有源程序中。

static关键字

当遇到两种情形:

  • 只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本不用创建任何对象。
  • 希望某个方法不与包含它的类的任何对象关联在一起,也就是说,即使没有创建对象,也能够调用这个方法。

通过static关键字可以满足这两方面需求,当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。引用static变量有两种方法,可以通过一个对象去定位它,如:ObjectName.member,或者也可以通过类名直接引用,如ClassName.member。
量有两种方法,可以通过一个对象去定位它,如:ObjectName.member,或者也可以通过类名直接引用,如ClassName.member。
当static作用于某个字段时,会改变数据的创建方式(一个static字段对每个类来说都只有一分存储空间,而非static字段则是对每个对象有一个存储空间),但是static作用于方法,差别却没有那么大,static方法的一个重要用法就是在不创建任何对象的前提下就可以去调用它。static方法的这种特性很像全局方法。
在static方法内部不能调用非static方法和使用非static数据成员。

CATALOG
  1. 1. 前言
  2. 2. 用引用操作对象
  3. 3. 必须由你创建所有对象
    1. 3.1. 存储到什么地方
    2. 3.2. 特例:基本类型
    3. 3.3. Java中的数组
  4. 4. 永远不需要销毁的对象
  5. 5. 创建新的数据类型
    1. 5.1. 字段和方法
    2. 5.2. 基本成员默认值
  6. 6. 方法、参数和返回值
  7. 7. 构建一个Java程序
    1. 7.1. 名字可见性
    2. 7.2. 运用其他构件
    3. 7.3. static关键字