多态概述和演示;抽象类的概述;接口的概述和演示;
多态的概述及其代码体现
多态概述
某一个事物,在不同时刻表现出来的不同状态。
举例: Cat c=new Cat();
Animal a=new Cat();
猫可以是猫的类型。猫 m = new 猫();
同时猫也是动物的一种,也可以把猫称为动物。动物 d = new 猫();
多态前提:
要有继承关系。
要有方法重写。 其实没有也是可以的,但是如果没有这个就没有意义。
要有父类引用指向子类对象。
父 f = new 子();
多态中的成员访问特点
多态中的成员访问特点
成员变量:
编译看左边,运行看左边。
构造方法:
创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。
成员方法:
编译看左边,运行看右边。
静态方法:
编译看左边,运行看左边。
(静态和类相关,算不上重写,所以,访问还是左边的)
多态的好处:
1.提高了代码的维护性(继承保证)
2.提高了代码的扩展性(由多态保证)
多态的弊端:
不能直接使用子类的特有功能
解决问题
把父类的引用强制转换为子类的引用。(向下转型)
抽象类的概述及其特点
1.抽象类和抽象方法必须用abstract关键字修饰
抽象类格式: abstract class 类名 {}
抽象方法格式: public abstract void eat();
2.抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
3. 抽象类中可以有构造方法,抽象类不能进行实例化,那么要构造方法有什么作用呢?
用于子类访问父类数据时的初始化
4.抽象类不能直接实例化那么,抽象类如何实例化?
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
5. 抽象类的子类: 要么是抽象类 ,要么重写抽象类中的所有抽象方法
案例演示
具体事物:猫,狗
共性:姓名,年龄,吃饭
abstract不能和哪些关键字共存?
private 冲突
final 冲突
static 不能共存 无意义
接口的概述及其特点
接口特点:
1.接口用关键字interface表示 格式: interface 接口名 {}
2.类实现接口用implements表示 格式: class 类名 implements 接口名 {}
接口不能实例化:
那么,接口如何实例化呢?
按照多态的方式来实例化。
接口的子类:
1.可以是抽象类。但是意义不大。
2.可以是具体类。要重写接口中的所有抽象方法。(推荐方案)
接口的成员特点
成员变量;只能是常量,并且是静态的。
默认修饰符:public static final
建议:自己手动给出。
构造方法:接口没有构造方法。
成员方法:只能是抽象方法。
默认修饰符:public abstract
建议:自己手动给出。
类与类,类与接口,接口与接口的关系
类与类,类与接口,接口与接口的关系
类与类:
继承关系,只能单继承,可以多层继承。
类与接口:
实现关系,可以单实现,也可以多实现。
并且还可以在继承一个类的同时实现多个接口。
接口与接口:
继承关系,可以单继承,也可以多继承。
抽象类和接口的区别
成员区别
抽象类:
成员变量:可以变量,也可以常量
构造方法:有
成员方法:可以抽象,也可以非抽象
接口:
成员变量:只可以常量
成员方法:只可以抽象
关系区别
类与类
继承,单继承
类与接口
实现,单实现,多实现
接口与接口
继承,单继承,多继承
设计理念区别
抽象类 : 被继承体现的是:”is a”的关系。 抽象类中定义的是该继承体系的共性功能。
接口 : 被实现体现的是:”like a”的关系。 接口中定义的是该继承体系的扩展功能。
案例演示
动物类:姓名,年龄,吃饭,睡觉。
动物培训接口:跳高
猫继承动物类
狗继承动物类
部分猫继承猫类并实现跳高接口
部分狗继承狗类并实现跳高接口