1.2.1 抽象
将一类‘对象’的共同特征总结出来构造成‘类’的过程。
包括数据抽象和行为抽象,只关注对象有哪些属性和行为,不关注实现的细节。
1.2.2 封装
将数据和封装数据的方法进行有机结合,隐藏对象的属性和实现的细节,仅对外公开接口来和对象进行交互。
-
减少耦合、提高代码可重用性。
-
包:用于管理一系列的类的一个软件包,实际上是一个文件夹。 防止出现定义相同名称的类造成冲突。
-
访问修饰符
修饰符 | 本类 | 同包中的类 | 子类 | 其他类 |
---|---|---|---|---|
public | 可访问 | 可访问 | 可访问 | 可访问 |
protected | 可访问 | 可访问 | 可访问 | |
默认 | 可访问 | 可访问 | ||
private | 可访问 |
1.2.3 继承
-
子类继承父类的属性和方法,子类可直接访问非私有的属性和方法。
-
继承可以提高代码的复用性,减少冗余代码,并使得类和类之间产生一定的关系。
-
但一定程度的破坏了封装性,子类依赖了父类的实现,缺乏独立性。
1.2.4 多态
-
编译时多态: 方法的重载
-
运行时多态:3个条件,1有子类的继承、2子类重写父类的方法,3父类引用指向子类对象。 接口同样适用。
1.2.5 重载和重写
重载: 发生在同一类中, 同名且不同参数列表的方法 发生重载。
重写: 发生在子类,或实现接口的类中,子类重新实现父类已有的方法,同名同参同返回值, 且不能抛出更多更大的异常(里氏替换原则:子类可以扩展父类的功能,但是不能改变父类原有的功能)。
- 子类方法的访问权限必须大于等于父类方法;
- 子类方法的返回类型必须是父类方法返回类型或为其子类型。
使用 @Override 注解,可以让编译器帮忙检查是否满足上面的两个限制条件。
1.2.6 抽象类和抽象接口
抽象类和抽象方法都使用 abstract 关键字进行声明。抽象类一般会包含抽象方法,抽象方法一定位于抽象类中。
抽象类和普通类最大的区别是,抽象类不能被实例化,需要继承抽象类才能实例化其子类。
1.2.7 接口
java8之前,接口可以看成一个完成抽象的类;java8之后可有拥有默认的方法实现(不支持默认方法的维护成本较高)。
- 成员(字段 + 方法)默认都是 public 的,并且不允许定义为 private 或者 protected。
- 字段默认都是 static 和 final 的。
和抽象类的比较:
- 抽象类提供了一种 IS-A 关系,那么就必须满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。
- 从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
- 接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。
- 接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。