抽象类是一个特殊的类。
abstract:修饰符,抽象的意思 。
修饰类:抽象类。
修饰方法:抽象方法。
特点:
- 抽象类不能实例化
- 抽象方法要在抽象类中
- 抽象类必然有子类,子类想要创建对象,子类将继承的所有抽象方法全部覆盖。
如果只覆盖了部分抽象方法,那么子类依然是抽象类。
成员:
- 抽象方法
- 成员变量,成员方法,构造方法
抽象类中可以没有抽象方法,目的该类不能实例化。
注意:
abstract不能和final和private一起使用。
abstract不能和static修饰的抽象方法一起使用。
什么时候使用抽象类?
- 当不想要类能实例化时,可以定义为抽象类。
- 所有子类都需要将继承的方法进行覆盖,那么父类该方法应为抽象方法,那么该类是抽象类。
多态
指一个对象具备多种形态。
例如 :生活中水: 固态 液态 气态
Class 动物{}
Class 狗 extends 动物{}
创建对象时: 狗 d = new 狗(); //本态
动物 d = new 狗(); //多态
前提条件:必须有继承或者是实现。
表现形式:父类型引用指向自己的子类对象
好处:提高了代码的扩展性
弊端:不能访问子类特有的成员。
在方法中:参数中可以接收Animal类型,与可以接收Animal的子类
多态的类型转换:
向上转型(类型提升): 父类型引用指向子类型(小———> 大) Animal a = new cat();
向下转型(强制类型转换):将父类型引用转成子类型 (想要访问子类特有的方法时)(大———> 小)
注意:类型转换时,改变的是引用称呼,一会是父类型,一会是子类型
而对象本身由始至终都没有改变。
Animal a = new Animal();
Cat c = (Cat)a;
编译通过,运行出现ClassCastException异常。
instanceof:比较运算符,结果为boolean
比较是否是指定的类型
多态中成员的特点:
多态形式创建的对象:
1. 无论是静态成员还是非静态成员,编译器时期都看父类
2.对于成员方法,编译通过,运行的是子类的结果
3.对于静态方法,静态变量,变量,编译通过运行的都是父类结果