JAVASE-------多态+抽象类+接口+内部类
多态
多态
指的是一种事物,在不同时刻表现出的不同状态
前提
- 要有继承
- 要有重写,不重写也可以,但是不重写多态就没意义
父类的引用指向子类对象
父类 fu=new 子类();
多态访问成员特点
- 多态的形式访问成员变量,编译看左边,运行看左边,访问的都是父类,
- 多态的形式访问成员方法,编译看左边,运行看右边,编译期,看父类有没有这个方法,如果有就语法报错,实际调用时,是以子类重写过后的标准。当子类没有重写时,以父类为准
好处
- 提高代码的复用性和维护性
- 提高代码的扩展性
弊端
- 不能调用子类特有的功能
怎么才能调:
采用向下转型,把父类转化为子类
多态就是向上转型
向下转型
使用强转符:()
为了保证不报ClassCastException,在向下转型前,进行判断:instanceof
Instanceof
instanceof一般使用于多态的时候,在代码中判断对象的引用类型具体为哪一种类型。返回结果是boolean类型的。
注意:
- instanceof关键字不能比较基本类型的数据;
- 可以对对象和接口使用;
- 比较是基于多态的;
- 右边比较的类型只能为类和接口
抽象类
抽象类
抽取所有子类的共性功能,但是不给出共性功能的具体实现,而是交由子类根据自身的差异做以具体的实现
如何实现
- 通过关键字abstract来实现
定义格式
- 抽象类格式: abstract class 类名 {}
- 抽象方法格式: public abstract void eat();
语法特点
- 抽象类中,可以没有抽象方法,也可以有抽象方法。
- 一个类中,一旦有了抽象方法,此类就必须为抽象类。
- 抽象类,不能直接实例化,但是我们可以采用多态的形式,来间接实例化。
- 抽象类中所有抽象方法,强制子类必须重写
- 抽象类的子类有中选择
- 重写抽象类中的抽象方法
- 自己也是个抽象类
- 可以没有抽象方法,也可以有抽象方法。这样设计的考虑,非抽象方法,可以让子类直接继承使用,对于抽象方法,是要求子类必须重写的。
abstract
抽象的
abstract既可以修饰修饰类,也可以修饰方法
修饰类时
- 不可以被实例化
- 抽象类有构造器
- 抽象方法所在的类一定是抽象类
- 抽象类中可以没有抽象方法
- 当我们设计一个类,不需要创建此类的实例对象时,就可以考虑将其设置为抽象的,由其子类实现这个类的抽象方法以后,进行实例化
修饰方法时
- 没有方法体
- 抽象类只保留方法的功能,具体的实行,交给继承抽象类的子类重写
- 当子类重写抽象类中的所有抽象方法后,此类可以实例化
- 当子类重写抽象类中的抽象方法,但是没有全部重写,意味着此类中仍有抽象方法,则此类必须声明为抽象的
abstract不能共用的关键字
abstract 是强制子类重写
- private 私有的,不能继承,无法重写
- final 方法子类只能继承 不能重写
- static 方法不参与重写
接口
接口
为了定义一些额外扩展的功能,哪些事物,想要具备这些功能,可以对该接口进行实现。
- 接口可以看做是一个特殊的抽象类,是常量与抽象方法的集合,不能包含变量,一般的方法
- 没有构造器
- 实现接口的类,必须重写其中的所有抽象方法,才可以实例化
- 一个类可以实现多个接口
- 接口与接口之间是继承关系
如何实现
接口用关键字interface表示
- 格式: interface 接口名{}
类实现接口用implements表示
- 格式:class 类名 implements 接口名{}
接口的成员特点
-
接口中的成员变量,全部都是公共的静态常量 前面存在默认修饰符 public static final
-
JDK1.7之前,接口中的方法全部是抽象方法。方法前存在默认修饰符public abstract
JDK1.8之后,可以给出方法的具体实现,需用要关键字default修饰;接口中可以定义静态方法
-
接口中没有构造方法
-
接口不能直接new对象
抽象类和接口的区别
- 抽象类:可以定义抽象方法,也可以定义非抽象方法
接口:接口里面定义的是抽象方法,JDK1.8之后可以定义default修饰的方法和静态方法
- 抽象类:有构造方法
接口:没有构造方法
- 抽象类:可以定义成员变量,也可以定义常量
接口:全是公共静态常量
设计思想:
- 抽象类:抽取所有子类共性功能,并不给出共性功能的具体实现,而是交由子类根据自身的差异性,去做具体实现
- 接口:定义一些规范和规则,哪类事物想要具备这些扩展功能,可以实现具体的接口。接口只需要维护一套规范,由子类具体去实现
关系
类和类之间的关系:
- extends 继承关系 只能单继承
类和接口之间的关系:
- implements 实现关系 可以多实现
接口和接口之间的关系:
- extends 继承关系 可以多继承 一个接口可以继承多个接口
内部类
在类的内部再定义一个类,外面的类就是外部类,里面的类就是内部类
成员内部类
局部内部类
静态内部类
匿名内部类