文章目录
第4章 对象与类
4.1 面向对象程序设计概述
OOP -> 类(行为、状态、标识 )-> 对象变量 -> 对象(实例化)
类之间的关系:
- 依赖 (uses-a)
- 聚合 (has-a)
- 继承 (is-a)
4.2 使用预定义类
new + 构造器(构造函数)()
构造器、访问器、更改器
时间点:Date类;日期:LocalDate类
Date date = new Date();
LocalDate localDate = LocalDate.now(); // 静态工厂方法
LocalDate ld = LocalDate.of(2022, 9, 10); // 构造特定日期
// getYear getMonthValue getDayOfMonth getDayOfWeek plusDays minusDays
4.3 用户自定义类
每个类都可以有main方法(便于测试),只能有其一个公共类public(类名=文件名)。
class ClassName
{
field1 // 状态、实例
......
constructor1 // 构造器
......
method1 // 行为
......
}
// 编译Employee开头的源文件成类文件
javac Employee*.java
// 自动隐式编译相关源文件
javac EmployeeTest.java
隐式参数:对象(this);显式参数:括号中数值
注:对于可变对象的引用,不应直接返回(破坏封装性),应返回其克隆的副本(*.clone())!
注:方法可以访问所属类任何对象的私有特性,而不仅限于隐式参数!
// final
class Employee
{
private final String name; // 必须在构造器中初始化,且不能再修改
// final针对可变类:对象引用不会再指向另一个不同的对象,而这个对象可以更改
}
4.4 静态字段和静态方法
static :字段或方法属于类,每个对象实例同时共享,可通过类直接访问(没有隐式参数),静态方法只能访问静态字段。
4.5 方法参数
- 按值调用:方法得到参数值的副本,不可对其修改(基本数据类型);
- 按引调用:方法接收到变量地址,得到对象引用的副本(引用同一个对象),可对其修改(对象参数)。
注:Java方法不能让对象参数引用一个新的对象!
// 不起作用,不能替换,只是x与y交换了,
public static void swap(Employee x, Employee y)
{
Employee temp = x;
x = y;
y = temp;
}
4.6 对象构造
- 重载:多个方法有相同名字、不同参数。(编译器进行重载解析,根据参数匹配特定方法);
- 签名:方法名以及参数类型(不含返回类型,即不能有名字相同、参数类型相同而返回类型不同的方法)。
注:
- 局部变量不会自动初始化,类中字段可自动初始化为默认值!(0、false、null);
- 仅当类无任何构造器时,会产生一个默认的无参数构造器。
// 调用另一个构造器
public Employee(double s)
{
// call Employee(String, double)
this("Employee #", s);
}
// 初始化块
class Employee
{
private int id;
// 初始化块,运行在构造器之前
{
id = 1;
}
public Employee()
{
id = 2;
}
}
初始化字段顺序:
- 若构造器第一行调用了另一个构造器,则执行第二个构造器;
- 否则,(a) 初始化为默认值;(b) 按照声明顺序执行字段初始化方法和初始化块;
- 执行构造器主体代码。
4.7 包
嵌套的包之间没有任何关系,每个包都是独立的类集合
注:星号(import java.*)是导入一个包的所有内容,不是导入以java为前缀的所有包!
// 静态导入
import static java.lang.math.*;
sqrt(pow(x, 2)); // Math.sqrt(Math.pow(x, 2));
// 包中增加类,没写就是放入无名包(包名:反向路径)
package packageName;
public class Employee
{
......
}
// Java编译器处理文件(带文件分隔符,不会实际检查目录结构)
javac com/mycompany/PayrollApp.java
// Java解释器加载类(带有.分隔符)
java com.mycompany.PayrollApp
修饰符:
- public:所有类都可以访问;
- private:当前类可以访问;
- 无:(默认)包中所有类可以访问。
// 设置类路径
java -classpath <path> MyProg
4.8 JAR文件
JAR文件可以包含类文件,也可以包含图像及声音等其他类型的文件,还包括一个清单文件,用于描述归档文件的特殊特性。(类似zip压缩打包Java应用程序)
// 创建JAR文件
jar cvf jarFileName file1 file2 ...
// 启动程序
java -jar MyProgram.jar
4.9 文档注释
/**
* 标记:以@开始
* 自由格式文本(可用HTML修饰符)
*/
- 类注释:放在import之后,类定义之前;
- 方法注释:所描述的方法之前;
@param variable description;@return description; @throws class description;
- 字段注释:对公共字段(常指静态常量)建立文档;
- 通用注释:
@author name; @version text; @see reference;
- 包注释:直接将类、方法和变量的注释放在Java源文件中;
- 注释抽取
4.10 类设计技巧
- 保证数据私有,编写访问器与更改器方法;
- 对数据进行初始化,Java不会初始化局部变量,只会对对象的实例字段进行初始化;
- 不要在类中使用过多的基本类型,使用其他的类来代替;
- 不是所有的字段都需要单独的访问器与更改器;
- 分解有过多职责的类;
- 类名和方法名能体现它们的职责;
- 优先使用不可变的类,多个线程同时修改会出现不可预料的问题;