接口
接口 是一组规范和标准 接口的使用者与接口的实现者 都要遵循接口的标准与规范
接口 站在语法的角度 如果一个抽象类中都是抽象方法 那么我们可以将该抽象类声明成一个接口
一.接口的基本语法
1.语法
interface 接口名
{
}
a
.接口名命名规范 按照类的命名规范进行命名 所有单词首字母均大写
2.接口与抽象类的区别
1.相同点
a
.编译后都会生成对应的
.class文件
b
.抽象类与接口 只能被声明 不能被实例化
2.不同点
a
.接口没有构造方法
b
.接口中所有的方法 一定是公开 抽象方法(
public abtract修饰) 接口中 方法默认的修饰符是
public abstract 如果缺少编译器会自动补齐
注意
:类中的方法不写修饰符 默认的是 默认级别访问权限修饰符
接口的方法不写修饰符 默认的是
public abstract
c
.接口中可以定义属性
,接口中的属性一定是公开静态常量(
public static final 所修饰),接口中属性的默认修饰符是
public static final,而不是 默认的访问权限修饰符,无论缺少哪个,编译器都会将
public static final补齐
二.接口的实现
1.语法
class 类名
implements 接口名
{
}
例:
interface MyClass2{
public static final int A
= 10;
public abstract void m1();
public abstract void m2();
}
class Sub2 implements MyClass2{
public void m1(){
}
public void m2(){
}
}
a
.接口与类之间的关系被称为实现, 与抽象类和其子类的关系类似
b
.父类引用指向子类对象被称为多态 有了接口之后 接口类型指向实现类对象也是多态
MyClass2 mc
= new Sub2();
注意:
1.一个实现类如果没有实现接口中所有的抽象方法,那么该类仍旧是一个抽象类
2.在实现一个接口时,需要注意实现其方法,访问权限修饰符一定是
public,因为接口中的抽象方法一定是公开的
2.多实现
语法:
class 类名
implements 接口名
1,接口名
2,接口名
3....{
}
例:
class MyClass implements InterfaceA,InterfaceB
,InterfaceC
,InterfaceD
,InterfaceE
{
public void m1(){
System
.out
.println("这是InterfaceA的m1方法");
}
public void m2(){
System
.out
.println("这是InterfaceB的m2方法");
}
public void m3(){
System
.out
.println("这是InterfaceC的m3方法");
}
public void m4(){
System
.out
.println("这是InterfaceD的m4方法");
}
public void m5(){
System
.out
.println("这是InterfaceE的m5方法");
}
}
注意:多实现的场景下,一个实现类如果没有实现接口中所有的抽象方法,那么该实现类会是一个抽象类
3.实现多个接口的情况下 同时 继承一个父类
语法
:
class 类名
extends 父类
implements InterfaceA,InterfaceB
,InterfaceC
,InterfaceD
,InterfaceE
{
}
例:
class MyClass extends Super implements InterfaceA,InterfaceB
,InterfaceC
,InterfaceD
,InterfaceE
{
public void m1(){
System
.out
.println("这是InterfaceA的m1方法");
}
public void m2(){
System
.out
.println("这是InterfaceB的m2方法");
}
public void m3(){
System
.out
.println("这是InterfaceC的m3方法");
}
public void m4(){
System
.out
.println("这是InterfaceD的m4方法");
}
public void m5(){
System
.out
.println("这是InterfaceE的m5方法");
}
public void m6(){
System
.out
.println("这是覆盖 Super 的m6 方法");
}
}
三.接口之间的多继承
1.语法
接口与接口之间的关系 多继承 一个接口可以继承多个接口
interface 接口名
extends 接口名
1,接口名
2,接口名
3.....{
}
当一个接口 继承多个接口时 会同时继承多个接口中的方法
2.接口多继承后的多态关系
有了接口之后 多态的语法大致分为以下这些情况
MyClass mc
= new MyClass();
1.父类引用指向子类对象
Super s
= mc
;
2.接口类型的引用 指向 实现类对象
InterfaceC inc
= mc
;
3.父接口类型的引用 指向 子接口类型的引用
InterfaceA ina2
= inc
;
4.父接口类型的引用 指向 子接口类型实现类的对象
InterfaceA ina
= mc
;
以下是案例中 接口与类 接口与接口之间的关系
interface InterfaceA{
void m1();
}
interface InterfaceB{
}
void m2();
interface InterfaceC extends InterfaceA,InterfaceB
{
void m3();
}
interface InterfaceD{
void m4();
}
interface InterfaceE extends InterfaceD{
void m5();
}
class Super{
public void m6(){
System
.out
.println(" Super的m6方法");
}
}
class MyClass extends Super implements InterfaceC,InterfaceE
{
public void m1(){
System
.out
.println("这是InterfaceA的m1方法");
}
public void m2(){
System
.out
.println("这是InterfaceB的m2方法");
}
public void m3(){
System
.out
.println("这是InterfaceC的m3方法");
}
public void m4(){
System
.out
.println("这是InterfaceD的m4方法");
}
public void m5(){
System
.out
.println("这是InterfaceE的m5方法");
}
public void m6(){
System
.out
.println("这是覆盖 Super 的m6 方法");
}
}
3.接口多继承之后的类型转换
1.自动类型转换
目标类型 是 原类型的父类 所实现的接口类型 父接口类型 小转大
例:
MyClass mc
= new MyClass();
Super s
= mc
;
InterfaceC inc
= mc
;
InterfaceE ine
= mc
;
InterfaceA ina
= mc
;
InterfaceA ina2
= inc
;
2.强制类型转换
对于类与类之间,原类型是目标类型的父类类型 可以发生强转
如果接口类型参与类型转换,无论接口类型是目标类型还是原类型,只要使用强转语法均可以通过编译
(有了接口之后 接口与接口 类与接口之间的关系过于复杂,编译器不在进行检查)
1.强转成功 原类型中所存储的对象 与目标类型兼容时
InterfaceC inc
= mc
;
Super s
= (Super
)inc
;
InterfaceE ine
= (InterfaceE
)inc
;
InterfaceD ind
= (InterfaceD
)inc
;
MyClass mc2
= (MyClass
)inc
;
System
.out
.println(mc
instanceof Super);
System
.out
.println(mc
instanceof InterfaceE);
System
.out
.println(mc
instanceof InterfaceD);
System
.out
.println(mc
instanceof MyClass);
2.强转失败 原类型中所存储的对象 与目标类型不兼容时
Super s2
= new Super();
System
.out
.println(s2
instanceof Super);
System
.out
.println(s2
instanceof InterfaceE);
System
.out
.println(s2
instanceof InterfaceD);
System
.out
.println(s2
instanceof MyClass);
如果强转失败 会出现 java
.lang
.ClassCastException 类型转换异常
3.A与B是否兼容 在有了接口之后的变化
如果B是A的父类 或B是A的接口类型 或B是A的父接口类型 或B与A 一致 那么我们称A与B兼容
a引用
instanceof b类型 关键字依然可以用来检查 一个引用中所存的对象是否和某个类型兼容
但是需要注意,如果a引用的类型 或 b类型 有一个是接口类型时,
instanceof 均不会进行编译时的验证
(有了接口之后 接口与接口 类与接口之间的关系过于复杂,编译器不在进行检查)
3.小结
1.接口和类之间 多实现(一个类可以实现多个接口)
2.类和类之间 单继承(一个类只能有一个直接父类)
3.接口与接口 多继承(一个接口可以继承多个接口)