面向对象的三大特征之 多态 + 接口的概述

面向对象的三大特征之 多态 + 接口的概述


前言

面向对象的三大特征:封装、继承、多态

extends继承 或者 implements接口 的实现,是多态性的前提 一个对象同时拥有几种形态,这叫做对象的多态。
代码中体现的多态就是,父类引用指向子类对象(子类的对象被当作父类使用)
格式: 父类名称 对象名=new 子类名称();
或者:接口名称 对象名=new 实现类名称();

一、接口的概述

接口就是一种公共的规范标准:
只要符合规范标准,大家就可以通用
接口是一种引用数据类型,最重要的内容是其中的抽象方法

如何定义一个接口的格式:

public interface 接口名称{}

备注:换成interface关键字后编译生成的字节码文件任然是XXX.class
如果是java7,那么接口可以包含的内容有:

1、常量
2、抽象方法

如果是java8,那么接口可以包含的内容有:

1、常量
2、抽象方法
3、默认方法
4、静态方法

如果是java9,还可以额包含:

1、常量
2、抽象方法
3、默认方法
4、静态方法
5、私有方法

任何一个java版本,接口都可以定义抽象方法:
格式 public abstract 返回值类型 方法名();
注意事项:
1、接口当中的抽象方法,修饰符必须是两个固定的关键字

public abstract

2、这两个关键字修饰符,可以选择性省略。

接口抽象方法的使用:

1.接口不能直接使用,需要一个实现类来实现接口 格式:

 public calss 实现类 implements 接口名称{} 

2、接口的实现类必须覆盖重写接口中所有的抽象方法 实现:去掉abstract关键字,加上方法体 。

3、创建实现类的对象,进行使用

      注意事项: 如果实现类没用覆盖重写接口中的抽象方法,那么这个实现类也必须是抽象类。

从java8开始,接口中运行定义默认方法。

格式: public default 返回值类型 方法名(){}
注意:默认方法有方法体,public可以省略
备注:接口的默认方法可以解决接口升级的问题,

调用默认方法:直接调用,如果实现类当中没有,会向上查找 实现类可以覆盖重写默认方法。

从java8开始接口可以定义静态方法:

格式:public static 返回值类型 方法名(){}
提示:就是把abstract或者default直接换成static就行,带上方法体。

错误:不能通过接口实现类对象来调用接口当中的静态方法
正确方法:通过接口名称直接调用其中的静态方法。

接口当中可以定义成员“变量”,但是必须使用public static final 三个关键字进行修饰。

从效果上看,这其实就是接口的常量 格式;
public static final 数据类型 常量名=数据值;
注意:
1、在接口常量当中,关键字可以省略。
2、接口当中的常量必须进行赋值,不能不赋值。
3、接口中常量的名称使用完全的大写字母,每个单词之间使用下划线分割。

在java9+版本中接口的内容

1、成员变量其实是常量,常量必须进行赋值,而且赋值之后不可改变。常量名必须大写。
2、接口中最重要的是抽象方法 格式:
public abstract 返回值类型 方法名();
3、从java8开始接口里运行定义默认方法
格式:public default 返回值类型名()
4、从java8开始接口里可以定义静态方法
格式:public static final 返回值 名(){}
5、从java9开始接口可以定义私有方法.私有方法只能被接口里面的方法使用

错误写法:

1、接口不能有静态代码块。
2、接口不能有构造方法。
3、一个类的父类是唯一的,但是一个类可以同时实现多个接口。
格式:public class MyInterfaceImpl implementsMyinterface1,MyInterface2{}
4、如果实现类与多个接口的抽象类重名,那么只需要覆盖重写一次即可。
5、如果实现类,没有覆盖重写所有接口当中的所有的抽象方法,那么实现类也必须是一个抽象类。
6、如果实现类,于多个接口的默认方法发生重名冲突,那么类一定要对冲突的默认方法进行覆盖重写。
7、如果一个类,她的父类的方法于接口的默认方法重名产生冲突,会默认优先父类。

接口之间的多继承:
1、类于类之间是单继承的,直接父类只有一个
2、多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,而且需要带着defaut关键字。

多态的使用细节

多态访问成员变量的两种方式

1、看等号左边是谁就优先用谁,没有就向上找。
2、间接通过成员方法访问成员变量,看该方法属于谁,优先用谁,没有则向上找。
(多态调用时,子类没有覆盖重写就是父,子类覆盖重写了就是子类)
成员变量:编译看左边,运行也看左边。

多态访问成员方法的特点

看new的是谁,就优先访问谁,没有则向上找
口诀:编译看左边,运行看右边

Fu f=new Zi();
f.merhodZi();
f.methodF();

运行的时候看右边是谁就优先谁(编译看左边,左边没有该方法故编译报错)

多态的好处:
无论等号右边new的时候换成哪个子类对象,等号左边的调用方法不会改变

对象的向上/向下转型

向上转型

格式:父类名称 对象名=new 子类名称()//就是多态
含义:创建一个子类对象,把它当作父类来使用
注意事项:

向上转型一定是安全的,因为它是从小范围转向大范围(但是有个弊端,一旦向上转型为fu,那么就无法调用子类特有的方法)。

向下转型

格式:
子类名称 对象名=(子类名称)父类对象;
含义:将父类对象还原成为子类对象
注意事项:
1、new的是谁,向下转型时也只能转型成它的对象

判断是否可以向下转型 可以使用 关键字instanceof

格式: 对象名 instanceof 类型
这将会得到一个布尔值结果,这将判断前面的对像能不能当后面类型的实列。

Father father=new Child();
//判断是否可以向下转型 成为 Child 
if(father instanceof Child){
	Child child=(Child)father ;
}
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页