多态性:
面向对象的三大特征:封装、继承、多态
封装是为了保护属性的一种操作,继承是为了扩展类的功能
而多态性是由封装性和继承性引出的面向对象程序设计语言的另一种特征
多态的体现:
1)从方法的角度看:方法的重载和重写
a.重载(Overload):根据传入的参数不同,完成的功能也不同。
b.重写(Override):子类根据需求重写父类中的方法。
2)从对象的角度看:对象的多态主要分为两种:向上转型、向下转型
a.向上转型:子类对象->父类对象(程序自动完成,不需要强转)
格式:父类 父类对象=子类实例;
例如:Student类继承Person类(即Person类是Student类的父类)
向上转型格式:Person person=new Student();
注意:向上转型后,因为操作的是父类对象,所以无法找到在子类中定义的新方法,但是如果子类重写了父类的某个方法,则调用的是重写后的方法。
b.向下转型:父类对象->子类对象(必须明确的指明要转型的子类类型)
格式:子类 子类对象=(子类)父类实例
例如:Student类继承Person类(即Person类是Student类的父类)
向上转型格式:Person person=new Student();
Student student=(Student)person;
注意:从上面的例子可以看出,向下转型前先要向上转型。
多态的好处:
a.提高代码的维护性(继承体现)
b.提高代码的扩展性(多态体现)
多态的弊端:父类不能使用子类的特有功能
抽象类:用abstract修饰的类即为抽象类
格式:abstract class 抽象类名{ }
注意:抽象类不能被实例化,必须被继承,抽象方法必须被重写,生成它的子类
抽象方法:用abstract修饰的方法就是抽象方法,抽象方法没有方法体。
注意:抽象类中不一定要包含抽象方法,但抽象方法一定要在抽象类中。
如果一个子类中没有实现抽象父类的所有抽象方法,则该子类也是一个抽象类。
构造方法、静态方法、私有方法、final方法不能被声明为抽象的方法
总结一下:
1.抽象类的特点:
a.抽象类和抽象方法必须用关键字abstract修饰
b.抽象类中不一定有抽象方法,但包含抽象方法的类一定是抽象类。
c.抽象类不能被实例化
d.抽象类的子类:
1)是一个抽象类
2)是一个具体类。这个类必须重写抽象父类中的所有抽象方法。
2.抽象类的成员特点:
A.成员变量:有变量、有常量
B.构造方法:有构造方法
C.成员方法:有抽象方法、有非抽象方法
3.抽象类的几个小问题:
A.抽象类有构造方法,但是不能实例化,那么构造方法有什么用呢?
答:用于子类访问父类数据的初始化。
B.一个类没有抽象方法却要定义为抽象类,有什么用?
答:为了不让创建对象
接口(interface):是抽象方法和常量值的定义的集合。
接口的使用规则:
接口的用途:
(1)通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系.
(2)通过接口指明多个类需要实现的方法
(3)通过接口了解对象的交互界面,而无需了解对象所对应的类
a.类与类:继承关系,只能单继承,可以多层继承
b.类与接口:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时,继承多个接口
c.接口与接口:继承关系,可以单继承,也可以多继承。
抽象类和接口的区别:
a.成员区别:
抽象类:有变量、有常量
接口:只有常量
b.关系区别:
类与类: 继承,单继承
类与接口: 实现,单实现,多实现
接口与接口: 继承,单继承,多继承
c.设计理念区别:
抽象类被继承体现的是共性功能
接口被实现体现的是扩展功能