JavaSE_多态
多态
多态性主要表现在两个方面:
- 重载:一个类中定义多个名字相同而实现不同的成员方法
- 要求与父类的方法名必须相同
- 方法的参数列表一定不一样
- 访问修饰符和返回值类型可以相同但也可以不同,但仅修饰符和返回值类型不同不构成重载
- 重写:对继承父类的某个成员方法进行重新实现
- 方法名与返回值类型必须与父类相同
- 参数列表必须相同
- 访问权限不能比父类中被重写的方法的访问权限低
- 子类若跟父类在同一个包中,父类中除了private和final的方法均可被重写
- 构造方法不能被重写,每个方法均有属于自己的构造方法
多态中成员访问特点
- 成员变量:编译看左边,执行看左边
- 成员方法:编译看左边,执行看右边
- 为什么成员方法和成员变量的访问不一样 因为成员方法有重写,而成员变量没有
多态的利弊
好处
- 提高了程序的扩展性
- 定义方法的时候,使用父类型作为参数,在将来使用时,使用具体的 子类型参与操作
弊端
- 不能使用子类所特有的功能
- 上转型对象不能访问其子类对象新增加的成员变量和方法,只能访问被子类继承并重写的变量或方法
抽象类
抽象类特点
-
抽象类和抽象和方法必须使用abstract关键字修饰
-
抽象类中不一定有抽象方法,有抽象方法的一定是抽象类
-
抽象类原则上必须被继承,抽象方法必须被重写
-
抽象类的子类
- 要么重写抽象类中的所有抽象方法、
- 要么该子类也是抽象类
-
抽象类不能实例化
- 若一定要实例化抽象类,可参照多态的方式,通过子类对象实例化,这叫抽象类多态
抽象类的成员特点
-
抽象类中有成员变量
- 可以是变量,也可以是常量
-
抽象类中有构造方法
- 虽有构造方法,但不能实例化。其存在的作用是用于子类访问父类数据的初始化
-
抽象类中有成员方法
- 可以有抽象方法:限定子类必须完成某些动作;也可以有非抽象方法:提高代码复用性
接口
接口的特点
- 接口用关键字interface来修饰,用implement来实现接口
- 在JDK8以后,可以有默认实现方法,须使用default关键字来修饰,亦可有静态方法
- Java中只支持单继承父类,但允许一个类同时实现多个接口,同时也可以继承多个接口,且一个接口可以被多个不同的类来实现
- 接口中声明属性默认为public static final,都是常量
- 接口中定义的方法默认为public abstract,都是抽象方法
- 若一个非抽象类实现某接口,则该类必须重写该接口中的所有方法,而且要显式地在这些被重写的方法前加public进行修饰
- 接口的实现类
- 要么重写接口中的所有抽象方法
- 要么是抽象类
- 接口不能实例化 若一定要实例化接口,可参照多态的方式,通过实现类对象实例化,这叫接口多态。
- 多态的类型:具体类多态、抽象类多态、接口多态
接口的成员特点
-
成员变量
- 只能是常量, 默认修饰符:public static final
-
成员方法
- 只能是抽象方法, 默认修饰符:public abstract
-
构造方法
- 接口没有构造方法,接口主要对行为进行抽象,没有具体存在
- 一个类如果没有父类,默认继承Object类
抽象类和接口的区别
-
成员区别:
- 抽象类:有变量、常量、构造方法;有抽象方法、非抽象方法
- 接口:只有常量;只有抽象方法
-
关系区别:
-
类和类的关系:继承关系,只能单继承,但是可以多层继承
-
类和接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
-
接口和接口的关系:继承关系,可以单继承,也可以多继承
-
-
设计理念区别:
- 抽象类:主要对类进行抽象,包括属性、行为
- 接口:主要对行为进行抽象
抽象类名作为形参和返回值
- 方法的形参是抽象类名,其实需要的是该抽象类的子类对象
- 方法的返回值是抽象类名,其实返回的是该抽象类的子类对象
接口名作为形参和返回值
- 方法的形参是接口名,其实需要的是该接口的实现类对象
- 方法的返回值是接口名,其实返回的是该接口的实现类对象