继承与多态,抽象类与接口
向上/向下转型
向上转型:Person p = new Student;
将子类型用父类型进行引用(因为子类拥有父类的全部功能,所以安全)
向下转型:Student s = (Student) p; 可能报错ClassCastException
操作符instanceof:在向下转型之前判断,防止报错
可以判断对象是否时某一类型或其子类(是的话都为true);但对象为 null 时总是false
继承和组合
继承是 is 关系
组合是 has 关系
- 小结
多态(动态调用)
- 引用变量的声明类型可能与其实际类型不符
- 实际对象的方法调用总是对应实际类型
- Java的实例方法调用是基于运行时实际类型的动态调用
优点:允许添加更多类型的子类实现功能扩展
覆写toString
直接使用 println 打印对象,实际运用了 .toString 方法,打印出其在JVM中的地址
所以需要覆写
final修饰
-
被修饰的方法:不能被覆写
-
被修饰的类:不能被继承
-
被修饰的字段:初始化后不能被修改
-
小结
抽象类
如果父类方法没有实际意义,可以将方法声明为抽象方法,那么这个类也就必然声明为抽象类:
- 抽象方法用 abstract 修饰
- 抽象方法不需要任何执行语句
- 因为无法执行抽象方法,该类必须申明为抽象类
- 抽象类不能实例化
调用抽象方法的同时,实现了多态:
- 小结
接口
- 若一个抽象类没有字段,所有方法都是抽象方法,可以把其定义为接口
- interface 声明一个接口
- 接口默认定义为public abstra,不用明写
- 实现 interfa 时,使用 implements ,可以实现多个
default 方法有自己的返回值,不需要所有子类实现,用到时子类可以对其进行覆写