多态
指的是一种事物在不同时刻表现出的不同状态
-
多态的前提:
1.要有继承,没有继承,多态就无从谈起
2.要有方法重写,可以不重写,但多态就失去了意义
父类引用指向子类对象 <===>父 f=new 子();
-
多态的形式来访问成员变量,编译看左边,运行也看左边
多态的形式访问成员变量,访问的都是父类的变量
-
多态的形式来访问成员方法,编译看左边,运行看右边
编译期看父类有没有这个方法,如果有就不报错。实际调用时,会以子类重写过后的为准。当然,子类确实没有重写,那就以父类为准。
-
多态的形式来访问静态方法,因为静态方法不算重写,故访问的都是父类。
-
多态的好处:1.提高代码的复用性和维护性(继承保证)
2.提高了代码的扩展性(多态保证)
-
多态的弊端:
多态不能直接调用子类特有的功能(我们可以采用向下转型来调用子类特有的功能)多态就是向上转型(父类引用指向子类)向下转型命名规则:Zi zi=(Zi)fu;
抽象类
-
因为不知道子类对这个功能的具体实现,所以也没必要给出功能贡献的具体实现,而是应该给出一个声明即可。
-
抽象类:抽取所有子类的共性功能,但是不给出共性功能的具体实现,而是交由子类根据自身的特性作以实现。
-
语法格式:abstract class 类名/方法名();
-
抽象类的语法特点:
-
抽象类中可以没有抽象方法,也可以有抽象方法。
-
一个类中一旦有了抽象方法,此类就必须为抽象类。
-
抽象类,不能直接实例化。但是可以采用多态的形式来间接实例化。Fu fu=new Zi();
-
抽象类中的所有抽象方法,强制子类必须重写。
-
抽象类的子类有两种选择,选择1:重写抽象类中的所有抽象方法。选择2:自己也是子类。
-
可以没有抽象方法,也可以有抽象方法。这样设计的考虑,非抽象方法,可以让子类直接继承使用,对于抽象方法,是要求子类必须重写的。
-
-
抽象类有构造方法,作用是为了让子类间接实例化
-
一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以,这个类不想让外界创建对象
-
abstract不能和哪些关键字共存?
private 矛盾 abstract 强制子类必须重写 private 私有的不能继承,重写不了
final 矛盾 final方法子类不能重写 abstract强制重写
static 方法不能参与重写
接口
是为了定义一些额外扩展的功能。哪些事物,想要具备这些功能,可以对该接口进行实现。
-
关键字:interface 在接口中提供扩展功能
-
接口的子类有两种选择:
- 重写接口中的所有抽象方法
- 自己本身是抽象类,但意义不大
-
接口中的成员特点;
- 接口中的成员变量,全部是公共的静态常量 前面存在默认修饰符 public static final 。接口名可以直接调用(a.num)
- jdk1.7 之前接口中的方法全都是抽象方法,不存在非抽象方法,方法前面存在默认修饰符 public abstract
- 接口中没有构造方法这一说。
- 接口不能实例化(new对象)
-
类与类之间的关系:继承关系 extends 并且是单继承
-
类与接口之间的关系:实现关系 implements 并且可以多实现(一个类可以实现多个接口。这个类,要把他所有实现的接口中的抽象方法重写)
-
接口与接口之间的关系:继承关系 extends 并且是多继承(一个接口可以继承多个接口)
-
jdk 1.8之后针对接口,做了一些新的定义。
jdk 1.8之后允许给出方法的具体实现,但这个方法得用default来修饰。
jdk 1.8之后接口中可以定义静态方法
-
java中的接口,更多的是来定义一些规则和一些规范的,以实现这个扩展性。
-
抽象类与接口的区别:
-
抽象类中可以定义抽象方法,也可以定义非抽象方法。
接口里面定义的是抽象方法,JDK 1.8后可以定义default修饰的方法和静态方法。
-
抽象类有构造方法;
接口没有构造方法这一说
-
抽象类可以定义成员变量也可以定义常量;
接口中诠释公共的静态常量。
-
设计思想:
抽象类是抽象所有子类的共性功能,并不给出共性功能的具体体现,而是交由子类根据自身的差异性,去做具体体现。
接口体现的是一种扩展的思想,通常用来定义一些规范和规则,哪些事物想要具备这些扩展功能,可以实现具体的接口,接口他只需要维护一套规范或者说规则,那么具体对规范的实现,是有子类来具体实现的。
例:动物类:姓名,年龄,吃饭,睡觉。
动物培训接口:跳高
猫继承动物类并实现跳高接口
狗继承动物类并实现跳高接口