《Java核心技术 卷I》读书笔记三
章节内容
- 面向对象程序设计
- 使用预定义类
- 用户自定义类
- 静态域和静态方法
- 方法参数
- 对象构造
- 包
- 类路径
- 文档注释
- 类设计技巧
面向对象程序设计
面向对象程序设计(OOP)已经取代了结构化程序设计。java是完全面向对象的。
OOP中我们不关心对象的具体实现,只要能满足需求。
类
类class是构造对象的模板或蓝图,由类构造对象的过程被称为创建类的实例。
java中所有类都继承Object类
对象
对象即类的实例,拥有类的所有方法
类之间的关系
最常见的关系有:
- 依赖 一个类的方法操纵另一个类的对象
- 聚合 一个类的对象包含另一个类的对象
- 继承 所有类都来源于Object类
使用预定义类
在java中一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。
用户自定义类
程序员习惯于将每个类存在一个单独的源文件中。
java编译一个类文件如果使用了其他类,就会查找该类的class文件,如果没有找到就会自动搜索java文件并编译,如果java文件较已有的class文件有更新,java编译器会自动重新编译这个文件。
java的构造器可以有多个,没有返回值,可以有任意个参数,与类同名,伴随着new一起被调用。
封装的好处:
- 改变内部实现,对其他程序不可见
- 可以在封装方法上加业务逻辑执行错误检查
final修饰符表示构建对象时必须初始化这样的。
静态域只属于类,不属于每个对象,所以每个类只有一个静态域static
static和final经常一起使用,比如Math类中的PI:
public class Math {
public static final double PI = 4.141592657....;
}
比如标准输出:
public class System {
public static final PrintStream out=....;
}
System类中有个setOut方法,虽然out域是final的,但是setOut是一个本地方法,不是用java语言实现的,可以绕过java语言的存取控制机制。
静态方法:不能向对象实施操作的方法,使用静态方法的情况:
- 一个方法不需要访问对象的状态,所需参数都是通过显式参数提供,Math.pow,main方法
- 一个方法只需要访问类的静态域
方法参数
两种类型:
- 基本数据类型
- 对象引用
java的对象采用的不是引用调用,实际上对象引用是按值传递的。创建一个交换两个对象引用的方法是不能生效的
java中方法参数的使用情况: - 一个方法不能修改一个基本数据类型的参数
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象
对象构造
重载:一个对象有多个方法有相同的名字,不同的参数
方法的签名:方法名、参数类型和个数
构造器中没有显式给域赋予初值的,就被自动赋予默认值,0,false,null等
如果没有编写任何构造器,则系统会提供一个无参数构造器,如果提供了至少一个构造器,则不会自动提供无参数构造器。
构造器调用另一个构造器可以用this关键字
初始化数据域的方法:
- 构造器中设置值
- 声明中赋值
- 在初始化块中赋值
首先运行初始化再运行构造器
调用构造器具体处理步骤:
- 所有数据域被初始化为默认值
- 按照在类声明中出现的次序,一次执行所有域初始化语句和初始化块
- 如果构造器第一行调用了其他构造器,则执行其他构造器
- 执行构造器的主体
因为java有自动垃圾回收,所以java不支持析构器
如果对象中使用了内存外的其他资源,可以在finalize方法中回收。finalize方法将在垃圾回收器清除对象之前调用。
包
java使用包package将类组织起来,使用包的主要原因是确保类名的唯一性
java通过包导入类,*表示导入一个包的所有类文件
静态导入可以导入静态方法和静态域的功能。
import static java.lang.System.*
out.println("hello world");
exit(0);
包中的类文件应该放在和完整包名匹配的子目录中。
java的域和方法的作用域默认为包作用域。
类路径
为了使类能够被多个程序共享,类文件可以存储在jar文件中。
为了使类可以被多个程序共享,需要做到以下几点:
- 把类放到一个目录中
- 将jar文件放在一个目录中
- 设置类路径。类路径是所有包含类文件的路径的集合
可以用-classpath或-cp指定类路径,也可以通过设置CLASSPATH环境变量来完成。
文档注释
java注释可以到处javadoc文档
类设计技巧
- 一定要保证数据私有
- 一定要对数据初始化
- 不要在类中使用过多的基本类型
- 不是所有的域都需要独立的域访问器和修改器
- 将职责过多的类进行分解
- 类名和方法名要能体现职责
- 优先使用不可变类