什么是多态
描述某一个事务在不同时间的状态
多态的前提条件访问特点
前提条件
必须有继承关系
有方法重写
父类引用指向子类对象
访问特点
- 成员变量编译看左,运行看左
- 成员方法编译看左,运行看右
- 静态方法,算不上重写,跟类相关
- 构造方法,分层初始化,先执行父类初始化,再执行子类
多态的弊端
-----不能访问子类特有的功能
多态的格式
FU fu = new Zi(); //向上转型
解决方案
创建具体子类对象
Zi zi = new Zi() ; //Zi:子类名
不好:需要重新开辟堆内存空间,消耗内存空间
向下转型
Zi z = (Zi)fu; //符号强转的语法
z.特有功能() ;
不需要单独去开辟堆内存空间
多态的好处
- 可以提高代码复用性,有继承关系的保证
- 可以提高代码的扩展性,由多态保证
abstract 抽象类
有抽象方法的类,一定是抽象类
public abstract 返回值类型(参数);
抽象类的特点
成员变量:可以是变量,也是自定义常量
成员方法:可以存在抽象方法,也可以存在非抽象方法
构造方法:可以存在无参/有参构造方法;分层初始化:先父类初始化,然后再是 子类初始化;
抽象类不能实例化:不能new对象
所以通过抽象类多态来实例化,通过具体的子类进行实例化
抽象类名 对象名 = new 具体的子类名() ;
abstract 不能和哪些关键字使用
抽象类不能实例化,而且它是强制子类必须重写抽象方法;
abstract不能和 static使用:
-----static被类名访问.跟类相关,静态方法算不上方法重写;
不能和private使用:
------被private修饰的:只能在当前类访问 而abstract修饰的方法需要被子类重写
不能和final使用
-------被final修饰的成员方法,不能被重写; (有的jdk源码中会看到) abstract修饰的方法必须子类重写;
interface 接口
什么是接口
接口:体现的是一种额外功能
接口比抽象类还抽象:抽象类都不能直接new对象,接口也不能 实例化
接口多态: 接口名 对象名 = new 子实现类名() ;
接口的定义
interface 接口名{}
接口和类名的命名规范同理,遵循"大驼峰命名法"
接口的成员特点
成员变量----没有成员变量,成员变量只能是常量
-存在默认的public static final 修饰的
成员方法----成员方法默认抽象 abstract
构造方法----没有构造方法
接口和抽象类的区别
1)成员的区别
成员变量:
--------抽象类:
可以是变量,也可以是自定义常量
-------接口:
成员变量只能是常量: 存在默认修饰符 public static final 修饰的 ,可以省略
成员方法
--------抽象类:
即可以是抽象方法,也可以是 非抽象方法
--------接口:
只能是抽象方法,存在默认修饰符:public abstract :可以省略
构造方法
--------抽象类:
既可以存在无参构造方法/有参构造方法,存在继承关系,分层初始化先父类初始化,再是子类初始化(子类需要用到父类中)
---------接口:
没有构造方法的 ,意义:就是通过接口暴露给外面功能,实现这些功能接口
2)关系区别
Java中最基本的单元是类,Java本身就面向接口编程
类和类:继承关系 extends,Java语言中只支持单继承,不支持多继承,但是可以多层继承
类和接口: 实现关系 implements;一个类继承另一个类的同时,可以实现多个接口
接口和接口:继承关系:extends 不仅支持单继承,也可以多继承!
3)设计理念的区别
抽象类:
存在继承关系, 体现的是一种"is a"的关系 ,什么是什么的一种A类是B类的一种,B类是A类的一种 ,这个时候要使用继承;
接口:
子实现类 实现关系,体现的一种"like a"的关系,什么像什么的一种额外的扩展功能 ;