接口:
1.接口是引用数据类型,一种特殊的抽象类
2.接口中可以存在
a.所有版本 JDK1.7 抽象方法和静态常量
静态常量
命名规则:
//默认添加public static final
全部大写,如果有单词拼接使用_进行拼接
ps: CASE_INSENSITIVE_ORDER
构造方法:接口没有构造方法
抽象方法
//默认添加public abstract
b. JDK1.8 静态方法 :static void 方法名()
//接口不是类,没有继承,所以没有静态方法
//in.m4();
//使用接口中的静态方法 接口名.方法名 调用
InterfaceA.m4();
默认方法:default void 方法名()
作用:功能的扩展
//默认方法
//实现类可以获得接口中的默认方法
//可以选择在实现类中重写
in.m3();
c. JDK1.9 私有方法:private void 方法名 ()
实现代码复用
private void 普通私有方法作用:提取默认方法中的公共部分
private static void 静态私有方法作用:提取静态方法中的公共部分
package b_Interface;
/*
实现类:
public class InterfaceImpl extends Father implements InterfaceA,InterfaceB,InterfaceC{}
1.一个类一定有唯一的父类, 可以有多个父接口
2.实现多个接口, 将这些接口中所有的抽象方法都实现掉
3.父类中有抽象方法, 也要实现掉
4.如果多个接口中,有重复的抽象方法,实现一次即可
5.如果多个接口中,有重复的default方法,必须要重写一个
*/
public class InterfaceTest {
public static void main(String[] args) {
InterfaceImpl in = new InterfaceImpl();
//抽象方法
in.abstractA();
in.abstractB();
in.abstractC();
in.abstractABC();
in.farher();
//默认方法
in.defaultA();
in.defaultB();
in.defaultC();
//如果接口A和接口B中有相同的默认方法
//必须重写默认方法,因为方法的实现不一样
in.defaultABC();
//静态方法
//接⼝中,存在同名的静态⽅法并不会冲突,原因是只能通过各⾃接⼝名访问静态⽅法
InterfaceA.staticA();
InterfaceA.staticABC();
InterfaceB.staticB();
InterfaceB.staticABC();
InterfaceC.staticC();
InterfaceC.staticABC();
//子类中可以使用什么方法
/*
1.独有的方法
2.父类中继承过来的所有方法
3.接口中的 默认方法 和 抽象方法
*/
}
}
3.接口的使用步骤
a.接口不能new对象,需要有个实现类 实现接口
b.实现类中必须重写接口中所有的抽象方法
c.通过实现类调用方法
package d_interface;
/*
Interface: 接口
引用数据类型:
数组/类/接口
xx.java -> xx.class -> 本质上也是一个类
所有版本: 抽象方法 和 静态常量
JDK1.7版本以上 不止有抽象方法
private/default
*/
public interface InterfaceA {
//成员变量 - 默认添加 public static final
//静态常量 -> 全大写,如果有单词拼接 使用_
/*public static final*/ int A = 10;
//抽象方法
public abstract void m1();
//普通方法不允许存在 - 抽象方法
public void m2();
//抽象方法
abstract void m3();
//最简化写法 - 开发最常用写法
void m4();
// 接口不是类 -> 没有父子类关系 -> 不可用
//protected abstract void m5();
}
接口和类的关系
类和类(单继承):1v1 extends 继承
接口和类:先实现接口 再继承父类没有这种关系
类 和接口的关系:1 v n implements
接口和接口(多继承):1 v n
接口作为方法参数和返回值使用的情况:
1).接口作为方法参数使用:
可以传所有实现类对象,所以具体使用的都是接口的实现类对象
2)接口作为返回值类型使用:
可以返回所有实现类对象,所以具体返回的都是接口的实现类对象
多态:
一种事物 多种形态,称为多态;
1.向上造型:
父类型引用 指向 子类型对象
接口类型 a = new 接口实现类对象()
父类型 a = new 子类型()
编译时状态(编译器)= 运行时状态
编译时状态:
决定了对象能调用哪些属性和方法
运行时状态:
决定了对象最终能调用哪些方法(重写)
2.向下转型
(强制类型转换)
a.有可能出现的问题:
不知道 引用 到底是什么类型
ClassCastException 类型转换异常
b.解决办法:
转换之前先判断 引用
实际上是不是要转换的类型对象
引用(a) instanceof 子类型()
Animal c = new Cat();
if(d instanceof Cat){
// java.lang.ClassCastException
Cat cat =(Cat)d;
cat.m1();
}
接口的多态形式
InterfaceA in1 = new InterfaceImpl(); 向上造型
InterfaceImpl in2 = (InterfaceImpl)in1; 向下转型
类的多态:
Animal d = new Dog(); 向上造型 //创建一个动物类型的狗对象
Dog dog=(Dog)d; 向下转型
3.多态出现的好处:
类型统一,规范代码,代码的复用性
4.多态出现的前提:
a.向上造型:在多态中需要将子类型的引用赋值给父类型对象
b.继承:必须存在父子类关系
c.重写:必须 子类重写父类中的方法