实现多态需要:
- 有继承或实现(接口)的关系
- 有方法重写
- 父类引用指向子类对象 e.g.
Animal a = new Dog();
多态中调用成员方法是编译看左(左边类型有没有此成员方法),运行看右(运行时实际使用右边类中的成员)
多态的应用场景:
父类型作为方法的形参的数据类型,这样使得方法可以接收任意的子类对象
多态中,成员变量是编译看左,运行看左。
类型转换:
- 向上转型(自动)
Animal animal = new Dog();
- 向下转型(强制)
Dog dog = (Dog)animal;
注意:
只能在继承层次内进行转换
将父类对象转成子类之前,使用 instanceof 进行检查
if(animal instanceof Dog) {}
抽象类:
比普通类多了一种抽象方法。其他一样都可以有,成员变量、常量、普通方法、构造方法。
public abstract class Animal {
int num = 30;
final int age = 1;
public abstract void eat();
public void sleep() {}
}
接口
接口不能实例化,必须通过多态方式实例化子类对象。
接口的子类可以是抽象类,也可以普通类。
类与接口是实现的关系,接口与接口是继承的关系。
接口没有成员变量,只有公有的静态的常量
成员方法:7及以前只有公有的抽象方法 8有了默认和静态方法 9有了private方法
接口没有构造方法
继承与实现的区别:
继承:父类定义的是共性内容
实现:接口中定义扩展功能