抽象类
在继承过程中,继承关系形成一个金字塔,位于金字塔底部的类越来越具体,而位于金字塔顶部的类越来越抽象。
当一个类的方法过于抽象,不确定如何实现,此时可以把该方法定义为抽象方法。
抽象方法所在的类过与抽象,称为抽象类(abstract class)。
形式 修饰符 abstract class 类名{
}
抽象类的特性
抽象类过于抽象,实例化无语义=>不能被实例化 //无法new
当一个方法过于抽象,需要将该方法声明为抽象方法 //public abstract void 方法名();
抽象方法一定位于抽象类中;抽象方法没有方法体;抽象类中的方法不一定全是抽象方法
子类继承抽象类,子类非抽象类时,一定要重写抽象类的方法,将其实现
实现 (implement): 实现建立在重写的继承上,是一种特殊的重写
Final关键字
用于修饰局部变量,属性,方法,类,表示最终的意思。
修饰类时,无法被继承;修饰方法,方法不能被重写;
修饰属性可与static搭配使用,形成静态常量;public static final String ABC="abc";
修饰基本数据类型,表示该值不能被改变
修饰引用数据类型,表示该地址不能被概念
多态(polymorphic)
多态可以减少类中代码量,可以提高代码的可扩展性和可维护性
在程序中,同一引用类型(一般指父类),使用不同实例而执行结果不同的,称为多态。
多态的存在要有3个必要条件:
1.要有继承 2.要有方法重写 3.父类引用指向子类对象
实现多态的步骤:
1.编写父类
2.编写子类,子类一定要重写/实现父类的方法
3.运行时,父类类型引用子类对象 //父类 a=new 子类();
如
public class Test01 {
public static void main(String[] args) {
// 同一引用类型
Petpet = null;
// 父类引用 引用 子类对象
pet = new Dog("二狗",100,0,"土狗");
// 呈现多态
pet.eat();
pet = new Penguin("大脚", 90, 50, Penguin.SEX_FEMALE);
// 呈现多态
pet.eat();
}
}
多态的实现形式
1.父类类型引用子类对象(本质)
2.父类作为方法形参实现
public void feed(Pet pet) {
}
3.父类作为方法的返回值
public Pet feed(int a) {
}
类型转换
在多态中有两种类型转换
1.自动类型转换(向上类型转换)
子类可以自动转换成父类 //父类 引用=null; 引用=new 子类(); Pet pet = null; pet= new Dog();
2.强制类型转换(向下类型转换) //子类类型 引用 =(子类)父类对象 Dog dog =(Dog) pet;
需要判断父类对象的真实类型,可用instanceof关键字
如 obj instanceOf 类/接口 判断obj是否是类/接口的实例
如果调用子类特有的方法,一定要强制类型转换。
public void play(Pet pet) {
if (pet instanceof Dog) {
Dog dog = (Dog) pet;
dog.catchFlyDisc();
}else if (pet instanceof Penguin){
Penguinpenguin = (Penguin) pet;
penguin.swimming();
}
}