面向对象程序设计概述
类之间的关系
- 依赖 (use - a)
一个类的方法使用或操纵另一个类的对象,我们就说一个类依赖另一个类
应该尽量相互依赖的类减至最少,减少类之间的耦合
- 聚合 (has - a)
一个对象包含另一个对象
包容关系,关联关系
- 继承 (is - a)
更特殊的类和一般的类之间的关系
扩展了类的方法
使用预定义类
例如Math类
调用这种预定义静态类中的方法,直接类名.方法名就行啦
对象和对象变量
构造器(构造方法):构造对象,指定初始状态
java类库中的LocalDate类
调用:用静态工厂而不是用构造器
LocalDate date = LocalDate.now();
int month = date.getMonthValue();
int today = date.getDayOfMonth();
date = date.minusDays(today - 1);//当前today-1天的日期,本月第一天
DayOfWeek weekday = date.getDayOfWeek();
int value = weekday.getValue();
System.out.println(value + "------");
System.out.println("Mon Tue Wed Thu Fri Sat Sun");
for (int i = 1; i < value; i++)
System.out.print(" ");
while(date.getMonthValue() == month){
System.out.printf("%3d",date.getDayOfMonth());
if (date.getDayOfMonth() == today)
System.out.print("*");
else
System.out.print(" ");
date = date.plusDays(1);
if (date.getDayOfWeek().getValue() == 1) System.out.println();
}
if (date.getDayOfWeek().getValue() != 1) System.out.println();
}
}
Mon Tue Wed Thu Fri Sat Sun
1 2
3 4 5 6 7 8 9
10 11 12* 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
1月12日
用户自定义类
用null引用
引用对象时问问自己是否希望接受一个可有可无的值,如果是,宽容型,不是,严格型
//宽容型方法把null参数转换为一个适当的非null值
String birthday = null;
if (birthday == null){
birthday = "unknown";
}
else birthday = birthday;
String s = birthday;
System.out.println(s);
//严格型拒绝null参数,报错:NullPointerException
System.out.println("The birthday cannot be null!");
隐式参数和显示参数
Demo02 d = new Demo02();
d.sou("I love java!");
//d: 隐式参数(目标,接收者)
//"I love java!": 显式参数
封装的优点
私有的数据字段
公共的字段访问器方法
公共的字段更改器方法
类的访问权限
方法可以访问调用方法的对象的私有数据
方法是私有的,则他不会在别处使用,使用者可以将他删除
方法是公共的,不能简单把他删除,可能会有其他代码依赖这个方法
final实例字段(属性)的特殊性
构造对象之后,final值不变
public class Demo03 {
public static void main(String[] args) {
Car bmw = new Car("bmw");
//这辆车确定就是宝马,不能改名字
}
}
class Car{
private final String name;
Car(String name) {
this.name = name;
}
}
静态字段和静态方法
静态字段
每个类只有一个static字段
private static int nextId = 1;
private int id;
//每个Tiger对象都有自己的id,这个类的所有实例共享一个nextId字段,只有一个
//静态字段nextId,属于类不属于对象
静态常量
尽量不要有公共字段,公共常量没问题,有final字段
private static final double PI =3.14159265358979323846;
静态方法
使用情况:
-
方法不需要对象状态,需要所有参数通过显示参数提供 举例:Math中的pow方法
-
方法只需要访问静态字段 举例:
Employee.getNextId();
工厂方法
静态工厂方法构造对象 举例:Localdate.now
方法参数
- 按值调用:方法接受的是调用者提供的值
- 按引用调用:方法接受的是调用者提供的地址
java是前者,方法不能修改传给他的任何参数变量的内容,只能通过实现一个改变对象参数状态的方法来创建不同参数值
java对方法参数能做什么不能做什么:
- 方法不能修改基本数据类型的参数
- 方法能改变对象参数的状态
- 方法不能让一个对象参数引用一个新的对象
对象构造
方法重载
多个方法有相同的名字,不同的参数
方法签名:方法名和参数类型
默认字段初始化
数值 | 0 |
---|---|
布尔值 | false |
对象 | null |
无参构造器
一个类没有编写构造器,默认存在一个无参构造器
显式字段初始化
每个实例字段都应该有一个有意义的初值
参数名
一个字母
参数前加a : aName aAge
this.name = name ( √ )
public Demo05(String name, int age) { this.name = name; this.age = age;}
初始化块(代码块)
只要构建个类的对象,这些块就会被首先执行
对象析构和finalize方法
析构器:回收存储空间 (垃圾gc)
finalize方法原来是清理垃圾的,已经废弃
包
将类组织在一个集合中,用包方便组织自己的代码,自己和别人的代码库分开管理
包名
因特网域名的逆序作为包名
实例:com.horstmann.corejava
导入类
简化类中代码的书写
实例:import java.time.*;
静态导入
import static java.lang.System.*;
class{
main{
out.println(“Hello,world.”);
}
}
包访问
默认情况包不是封闭实体,可见性
模块封装包:防止第三方修改
类路径
类路径和包路径匹配
设置classpath变量 java9
JAR文件
创建jar文件
在jdk/bin目录下
清单文件
每个jar文件包含一个清单文件
描述归档文件的特殊特性
可执行JAR文件
第三方工具把 .jar 文件 -> .exe 应用文件
文档注释
/**
中间可以写HTML语言 <> <> <> <> <> <>
*/
类注释
方法注释
字段注释
通用注释
包注释
注释抽取
类设计技巧
1. 数据私有
2. 对数据初始化
3. 不要在类中使用过多基本类型
4. 分解有过多职责的类
5. 类名和方法名见知意
6. 不是所有字段都要字段访问器和字段修改器(get set)
7. 有限使用不可变的类 例如:java.time包