多态
·什么是多态?
一个对象有多种形式的能力,一个类的子类可以定义它们唯一的行为,同时共享父类的某些相同特征
为什么需要使用多态?
Java只允许单继承,子类与父类间有IS-A的关系,这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,Java引入了多态性的概念,以弥补这点的不足
如何理解多态?
有两种理解方式:
①对象的不同的方法可以用相同的一个方法名,也就是重载 -- 静态多态
程序在编译时,系统就能决定调用哪个方法,所以也称为编译时多态,静态多态实现的方式就是方法重载,依据对象在定义时的类型相应地调用对应类中的重载方法
②同一对象根据不同的消息执行相应的行为,也可以这样认为发送消息给某一个对象,让对象自行选择哪种相应的行为 -- 动态多态
在运行中系统才能动态确定方法所指的对象,所以也称为运行时多态,动态多态的实现方式是重写父类中的同名成员方法,依据对象在实例化时而非定义时的类型,相应地调用对应类中的同名成员方法,动态多态主要通过动态绑定和重写的机制来实现
动态多态主要通过动态绑定和重写的机制来实现,了解多态之前先要了解几个基础技术:
①向上转型技术
一个父类的引用变量可以指向不同的子类对象,或者说一个子对象可以被当作一个父类类型
在继承关系中
沿着子类向父类向上转型是自动转换
从父类向子类必须使用强制类型转换才能实现向下转型
②instanceof关键
instanceof关键字用于判断运行时对象的真正类型,由于Java语言的多态机制导致了引用变量的声明类型和实际引用对象的类型,准确鉴别一个对象的真正类型,Java语言引入了instanceof运算符
③动态绑定技术
运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性。在运行时根据具体对象的类型进行绑定,Java中所有的普通方法,都采用动态绑定技术。通过动态绑定,JVM必须沿着继承层次树向下找,判断一个方法是否被重写。如果方法被重写了,在运行时就执行子类中的方法,而不是编译时调用的父类方法。要避免动态绑定默认行为的唯一方法是将方法声明为final,声明为final的方法不能被重写,final方法可以提升性能,因为避免了动态绑定的开销
抽象
什么是抽象:现在生活中无法准确描述的、不是真实存在的概念
什么是抽象类:是不能被实例化的类
什么时候需要用到抽象类:如果我们不需要类的实例时,就可以将类设计成为一个抽象类
如何书写抽象类:使用关键字abstract可以声明一个抽象类,该关键字可以出现在类声明时class关键字前的任何地方
什么是抽象方法:就是让某个方法变为抽象,不需要书写方法体,子类必须重写该方法
如何书写抽象方法:使用关键字abstract,例如:public abstract double computePay();
将一个方法声明为抽象方法有两个结果:
①类也必须声明为抽象类。如果一个类包含了抽象方法,那么该类也必须是抽象的
②任何子类必须重写抽象方法,除非子类本身也是抽象的
使用抽象类和抽象方法的好处:
①不需要实例化类,可以达到省时省力的效果
②强制子类进行某些方法的重写
③当有新的子类添加时,不会对任何其它类有影响,并且会按照要求