多态
多态表示不同的对象可以执行相同的动作,但是要通过它们自己的实现代码来执行。
多态的原理是当方法被调用时,无论对象是否背转换为其父类,都只有位于对象继承链最末端的方法实现会被调用。也就是所,虚方法(抽象方法)是按照其运行时类型而非编译时类型进行动态绑定调用的。
要深刻理解多态,不去研究设计模式是很难做到的。也可以反过来说,没有学过设计模式,那么对多态乃至对面向对象的理解多半都是肤浅和片面的。
抽象类
- 抽象类不能实例化
- 抽象方法是必须被子类重写的方法
- 如果类中包含抽象方法,那么类必须定义为抽象类,不论是否还包含其他一般方法
- 抽象类拥有尽可能多的共同代码,拥有尽可能少的数据
抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的,所以,在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点应当是抽象类。
接口和抽象类的异同
相同点:
抽象类和接口都是在抽象结果,共性就是抽象。其实,不论是接口、抽象类、类甚至对象,都是在不同层次、不同角度进行抽象的结果。
不同点:
- 抽象类可以给出一些成员的实现,接口不包含成员的实现(新版本的jdk支持了接口default方法默认实现)
- 抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现,一个类只能继承一个抽象类,但可以实现多个接口
总结:
- 类是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象,本质上都是抽象。
- 接口是对类的局部(行为)进行的抽象,而抽象类是对类整体(字段、属性、方法)的抽象。如果只关注行为抽象,那么也可以认为接口就是抽象类。
- 如果行为跨越不同类的对象,可使用接口,对于一些相似的类对象,用继承抽象类。比如猫狗其实都是动物,它们之间有血多相似之处,所以我们应该让它们继承动物这个抽象类,而飞机、麻雀、超人是完全不相关的类,叮当是动漫角色,孙悟空是古代神话人物,都是不想管的类,但是他们又有共同点,这时就需要都实现fly这个接口了。
- 通过上文不难发现,继承抽象类和实现接口不冲突,比如超人,除了内裤穿外面,基本就是个正常人的样子,所以让他继承人的类是对的,他还会飞,飞这个能力也可能是其他对象具备的,所以就让超人去实现飞行、力大无穷等接口,这样就可以让超人和飞机比飞行,和大象比力气了,这就是一个类只能继承一个抽象类,却可以实现多个接口的做法。
- 从设计角度来讲,抽象类是从子类中发现了公共的东西,泛化出父类,而接口是从根本不知子类的存在,方法如何实现还不确定,预先定义。这是抽象类和接口设计的思路不同。这也是敏捷开发的思想,通过重构改善既有代码的设计。抽象类是自底向上抽象出来的,而接口则是从顶向下设计出来的