1.1 抽象类的概念
- 所有的对象都是通过类来描述的,但是反过来不是所有类都可以描述对象。
- 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
1.2 抽象类的语法
abstract 关键字
- 在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。
- 注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法
1.3 抽象类的特性
- 1. 抽象类不能直接实例化出对象
- 2. 抽象方法不能是 private 的
- 3. 抽象方法不能被 static 和 final 修饰 -- 因为子类需要重写抽象方法
- 4. 抽象类必须要被继承,并且继承后的子类需要重写父类的抽象方法,否则子类也是一个抽象类,需要被abstract进行修饰
- 5. 抽象类中不一定有抽象方法,当时抽象方法一定属于抽象类
- 6. 抽象也有构造方法,供子类创建对象的时候,初始化父类的成员变量
1.4 抽象类的作用
2. 接口
2.1 接口概念
- 接口就是公共的行为规范标准,只要符合规范标准,就可以通用。
- 在Java中,接口是:多个类的公共规范,是一种引用数据类型。
2.2 语法规则
interface 关键字
- 接口的定义和类 类似,只需要将 class 换成 interface 关键字即可
- 提示:
- 1. 创建接口时,接口名字一般以 大写字母 I 开头
- 2. 软性要求:最好是形容词命名
2.3 接口的使用
implement 关键字
- 接口不能直接使用,需要搭配一个类来实现接口中的所有抽象方法
public class 类名称 implements 接口名称{
2.4 接口的特性
- 1. 接口类型是一种引用类型,但是不能直接 new 对象。
- 2. 接口中的方法都是 public abstract 修饰的 -- 默认的,所以为了简洁不需要添加。
- 3. 接口中的方法是不能直接在接口中实现的,只能由实现接口类中来实现。
- 4. 在类中,重写接口方法的时候,不能使用默认的访问权限 -- 因为默认的权限 < public
- 5. 接口中,可以含有变量,默认被 public static final 修饰
- 6. 接口中,不能由静态代码块和构造代码块
- 7. 接口虽然不是类,但是接口编译完成后的字节码文件的后缀也是 .class
- 8. 如果类没有实现接口中所有的抽象方法,则类必须设置为抽象类
- 9. jdk8 中,接口还可以包含 default 方法
2.5 实现多个接口
- Java不能多继承,所以接口的存在就是为了满足多继承的场景的 -- 即一个类可以实现多个接口。
- 继承表示的是 is - a的语义,而接口表示的具有什么特性
2.6 接口间的继承
- 用接口可以达到多继承的目的。
- 同样是 extends 关键字
2.7 接口的使用示例
给对象数组排序 -- 需要我们实现如何排序的方法
- 在 sort 方法中会自动调用 compareTo 方法. compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象.
- 注意事项: 对于 sort 方法来说, 需要传入的数组的每个对象都是 "可比较" 的, 需要具备 compareTo 这样的能力. 通过重写 compareTo 方法的方式, 就可以定义比较规则.
模拟实现使用接口的冒泡排序
2.8 Clonable 接口和深拷贝
- Java 中内置了一些很有用的接口, Clonable 就是其中之一.
- Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 "拷贝". 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常.
实现深拷贝 -- 每个引用类型都需要实现clone 且都需要进行赋值 -- 也就是说,成员变量有几个引用类型,就需要调用几次clone方法
2.9 抽象类和接口的区别
- 相同点
- 区别
- 1. 抽象类中可以包含普通方法和普通字段 -- 这些方法和字段可以直接被子类直接使用而不需要被重写;而接口中不能包含普通方法,子类必须重写接口中所有抽象方法。
- 2. 结构组成:抽象类中有普通方法+抽象方法;接口(抽象方法 + 全局变量)
- 3. 权限:抽象类中可以有各种各样的权限;接口中只能是public
- 4. 子类使用:子类通过extends来继承抽象类,通过interface来实现接口。
- 5. 关系:一个抽象可以实现若干个接口;接口不能继承抽象类,但接口可以使用extends关键字来继承多个父接口
3. Object 类
- Object 是Java默认提供的一个类。
- Java中除了 Object类,所有的类都是存在继承关系的 -- 默认都会继承Object父类。
- 即所有类的对象都可以用 Object 类来接受。
public static void main(String[] args) {
public static void function(Object obj) {
Object 类中方法
Object 中的方法都需要全部进行掌握
toString 方法 -- 获取对象信息
// Object类中的toString()方法实现:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
equals方法 -- 对象比较
Java中 == 比较:
- 如果==左右两侧是基本类型变量,比较的是变量中值是否相同
- 如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
- 如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的:
public boolean equals(Object obj) {
return (this == obj); // 使用引用中的地址直接来进行比较
结论:比较对象中内容是否相同的时候,一定要重写equals方法。
hashcode方法 -- 算了一个具体的对象位置
- hashcode方法用来确定对象在内存中存储的位置是否相同
- 事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。