一、多态
1.1 概念
程序中的多态:父类变量指向多个子类对象,当调用父类被重写的方法时,不同的子类有不同的结果。
多态:父类对象表现多种子类的形态的能⼒的特征,⼀句话多态就是⽗类引⽤⼦类对象。 向同⼀个⽗类的不同⼦类 发送同⼀条消息,⾏为不同。
对于父类中的一个方法,在不同子类中有不同的实现。父类引用子类对象,调用父类被重写的方法时,子类有不同的响应。
程序设计中为什么使用多态:
实现程序设计的开-闭原则,对扩展开放,对修改关闭
1.2 如何实现程序中的多态(里氏替换原则)
1.子类继承父类,重写父类方法。
2.定义父类变量(引用)指向子类对象。
3.调用父类被重写的方法时,不同子类有不同结果。
二、抽象类
抽象类:使用abstract关键字修饰的类。
[权限修饰符] abstract class 类名{}
抽象方法: 使用abstract关键字修饰的方法 注意:抽象方法没有方法体,也没有{}
[权限修饰符] abstract 返回值 方法名();//没有大括号
抽象类的特点:
1.抽象类不能创建对象,不能new对象
2.抽象类可以定义抽象方法,也可以没有抽象方法
3.有抽象方法 的类一定要定义成抽象类
4.抽象类中可以定义实例方法
5.抽象类可以定义构造方法,在子类中可以调用抽象类的构 造方法
6.子类继承了抽象类,则一定要重写/实现其中的抽象方法,如果没有实现父类的抽象方法,则子类也要变成 抽象类
7.抽象方法需要在方法前写abstract关键字,并且不能有方法体(不能写大括号)
抽象类的作用:定义共性的属性和行为,主要是让子类继承,抽象类本身不能new对象。
三、 接口
接口:是实现多态的另一种手段。
接口:一种标准、规范。对行为(方法)的抽象;一系列抽象方法的集合;公共的规范,大家都要遵从这个规范使用。定制规则,展现多态。
接口和抽象类的地位等同,作为顶级存在(父类)。
接口关键字:interface
实现接口:implements
实现接口意味着拥有了接口所表示的能力
接口和抽象类实现多态的区别:
如果一组对象有共同属性和行为,此时应该用抽象类去进行结构设计。
如果一组对象没有共同属性,只有共同行为,此时应该用接口去进行结构设计。
接口(interface)实现多态步骤:
1.定义实现类实现(implements)接口
[权限修饰符] class 类名 implements 接口1,接口2,接口3。。。{} eg:public class Mouse implements USB{}
2.定义接口变量指向实现类对象。
3.调用接口被实现的抽象方法时,不同对象有不同行为。
注意:如果实现类没有覆盖重写接口中的方法,那么这个实现类自己就必须是抽象类。
接口的特点:
-
一个实现类可以实现多个接口,并且要实现接口中的所有方法。
-
一个类在继承其他类的同时可以实现其他接口。
-
接口可以继承接口。实现类实现一个接口时,要实现接口继承过来的所有方法。
-
接口中可以定义变量,但是接口中的变量必须是公有的静态(static)常量(final)。
-
接口中的方法:
a. 在jdk1.8之前都只能是公有抽象的方法(方法上有abstract关键字,并且不能有方法体。
b. 在jdk1.8之后
1) 接口可以有抽象方法。
2) 也可以有默认方法(用default关键字修饰,有方法体),可以被实现类直接使用,也可以被实现类重写。
3) 也可以有静态方法(用static关键字修饰,有方法体),可以通过接口名直接调用,不能被实现类重写。
-
接口不能实例化,不能有构造方法。
-
子类实现接口必须实现接口中的所有方法。
四、 向上转型 向下转型
向上转型:⽗类引⽤⼦类对象(⾃动成⽴,缺点是失去调⽤⼦类独有⽅法的能⼒)
向下转型:⼦类引⽤⽗类对象(强制转换,慎重)