多态特征,instanceof关键字和abstract类
多态
对象有多种状态。作用:提高程序的可扩展性。
一个对象具备多种状态的能力,这个程序是可扩展的。
前提:
必须有层级关系 继承 实现
继承:子类和父类的关系,一个父类可以有多个子类,说明父类的引用有多种形态,父类指向子类的引用
父类 父类对象=new 子类();
作用类型: 形参、返回值、创建对象
可以将子类的方法重载,也可以直接将方法的形式参数类型改成父类的对象,子类对象向上转型为父类的引用,可以把它理解为类型隐式转换,由低到高。
在多态情况下,无法直接获得子类独有的成员,需要进行强制转换,向下转换为子类的类型,由高到低:
PM pm=(PM)employee;
但是假如方法里面还有其他子类的方法,需要使用instance判断employee对象是否某子类型的
instanceof
判断一个引用是否是一个类的实例
employee instanceof PM
判断employee对象否是PM类型
如果说子类有很多私有属性需要访问,可以使用方法重载来替换
抽象类abstract
每个子类都选择重写该方法,那么说明父类中该方法没有逻辑意义,就可以将该方法变成一个没有方法体的方法,变为抽象方法,且抽象方法在的类为抽象类,因此父类中也需要加上abstract
@Setter
@Getter
public abstract class Pets {
public abstract void fun();
}
抽象类一般出现在继承里面,且作为父类存在,且父类的抽象方法需要在每个子类中重写,抽象类中可以没有抽象方法,但是抽象方法中一定要有抽象类
@Setter
@Getter
public class JiXiangCat extends Pets {
private String name;
@Override
public void fun(){
}
}
抽象类中的属性和方法与普通类一样,但是会存在一个抽象方法,对于抽象方法可以与哪些修饰符一起使用?
public, protected, 默认, 不能加static修饰符
虽然有构造,抽象类不能直接创建对象,抽象类是服务于子类对象创造的,服务多态
使用抽象类创建匿名内部类,需要在创建的对象后面加上抽象方法的重写
public static void main(String[] args) {
Pets pets=new Pets() {
@Override
public void fun() {
}
};//创建匿名内部类对象
}
此时等同于创建了一个子类匿名的内部类对象,且对象类型是pets,如果需要向下调用子类独有的方法和属性,需要将改匿名内部类对象转化成子类型的对象:
public static double calculate(Employee employee){
if(employee instanceof PMEmployee){
PMEmployee employee1=(PMEmployee)employee;
employee1.setSalary(employee1.getSalary()*(1+(employee1.getBonus())));
return employee1.getSalary();
}
else return employee.getSalary();
}