接口
接口就是多个类的公共规范
接口是一种引用数据类型,最重要的内容就是其中的:抽象方法
1 2 3 4
| public interface 接口名称{ }
|
如果是Java7,那么接口中可以包含的内容有:
常量
抽象方法
如果是Java 8,还可以额外包含有:
默认方法
静态方法
如果是Java 9,还可以额外包含有:
接口使用步骤:
- 接口不能直接使用,必须有一个“实现类”来“实现”接口。
格式:
1 2 3
| public class 实现类名称 implements 接口名称{
}
|
- 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。
实现:去掉abstract关键字,加上方法体大括号。
注意事项:
如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类。
接口的定义
接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| package com.tipdm.Demo01;
public interface MyInterfaceAbstract {
public abstract void methodAbs1();
abstract void methodAbs2();
public void methodAbs3();
void methodAbs4(); }
|
接口实现类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package com.tipdm.Demo01;
public class MyInterfaceAbstractImpl implements MyInterfaceAbstract{
@Override public void methodAbs1() { System.out.println("这是第1个方法"); }
@Override public void methodAbs2() { System.out.println("这是第2个方法");
}
@Override public void methodAbs3() { System.out.println("这是第3个方法");
}
@Override public void methodAbs4() { System.out.println("这是第4个方法");
} }
|
主类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| package com.tipdm.Demo01;
public class demo1 { public static void main(String[] args) {
MyInterfaceAbstractImpl myInterfaceAbstract = new MyInterfaceAbstractImpl(); myInterfaceAbstract.methodAbs1(); myInterfaceAbstract.methodAbs2(); myInterfaceAbstract.methodAbs3(); myInterfaceAbstract.methodAbs4(); } }
|
1 2 3 4 5 6
| 这是第1个方法 这是第2个方法 这是第3个方法 这是第4个方法
进程已结束,退出代码0
|
接口的默认方法
- 接口的默认方法,可以通过接口实现类对象,直接调用。
- 接口的默认方法,也可以被接口实现类进行覆盖重写。
接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package com.tipdm.Demo02;
public interface MyInterfaceDefault {
public abstract void methodAbs();
public default void methodDefault(){ System.out.println("这是新添加的默认方法"); }
}
|
接口的实现类A:
1 2 3 4 5 6 7 8
| package com.tipdm.Demo02;
public class MyInterfaceDefaultA implements MyInterfaceDefault{ @Override public void methodAbs() { System.out.println("实现了抽象方法!AAAAAA"); } }
|
接口的实现类B:
1 2 3 4 5 6 7 8 9 10 11 12 13
| package com.tipdm.Demo02;
public class MyInterfaceDefaultB implements MyInterfaceDefault{ @Override public void methodAbs() { System.out.println("实现了抽象方法!BBBB"); }
@Override public void methodDefault() { System.out.println("实现类B覆盖重写了接口的默认方法"); } }
|
主类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package com.tipdm.Demo02;
public class demo1 { public static void main(String[] args) { MyInterfaceDefaultA a = new MyInterfaceDefaultA(); a.methodAbs(); a.methodDefault();
MyInterfaceDefaultB b = new MyInterfaceDefaultB(); b.methodAbs(); b.methodDefault(); } }
|
1 2 3 4 5 6
| 实现了抽象方法!AAAAAA 这是新添加的默认方法 实现了抽象方法!BBBB 实现类B覆盖重写了接口的默认方法
进程已结束,退出代码0
|
接口的静态方法
接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package com.tipdm.Demo03;
public interface MyInterfaceStatic { public static void methodStatic() { System.out.println("这是接口的静态方法!"); } }
|
接口实现类:
1 2 3 4
| package com.tipdm.Demo03;
public class MyInterfaceStaticImpl implements MyInterfaceStatic{ }
|
主类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package com.tipdm.Demo03;
public class demo1 { public static void main(String[] args) {
MyInterfaceStatic.methodStatic(); } }
|
接口的私有方法
接口A:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package com.tipdm.Demo04;
public interface MyInterfacePrivateA { public default void methodDefault1(){ System.out.println("默认方法1"); method(); }
public default void methodDefault2(){ System.out.println("默认方法2"); method(); }
private void method() { System.out.println("AAA"); System.out.println("BBB"); System.out.println("CCC"); } }
|
接口B:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package com.tipdm.Demo04;
public interface MyInterfacePrivateB { public static void methodDefault1(){ System.out.println("静态方法1"); methodStaticCommon("AAA", "BBB", "CCC"); }
public static void methodDefault2(){ System.out.println("静态方法2"); methodStaticCommon("AAA", "BBB", "CCC"); }
private static void methodStaticCommon(String aaa, String bbb, String ccc) { System.out.println(aaa); System.out.println(bbb); System.out.println(ccc); } }
|
接口的实现类:
1 2 3 4 5 6 7 8
| package com.tipdm.Demo04;
public class MyInterfacePrivateImpl implements MyInterfacePrivateA{ public void methodAnother(){
} }
|
主类:
1 2 3 4 5 6 7 8 9 10 11
| package com.tipdm.Demo04;
public class demo1 { public static void main(String[] args) { MyInterfacePrivateB.methodDefault1(); MyInterfacePrivateB.methodDefault2();
} }
|
接口中的成员变量
接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.tipdm.Demo05;
public interface MyInterfaceConst { public static final int NUM = 10; }
|
主类:
1 2 3 4 5 6 7 8
| package com.tipdm.Demo05;
public class demo1 { public static void main(String[] args) { System.out.println(MyInterfaceConst.NUM);; } }
|
一个类可以同时实现多个接口
使用接口的时候,需要注意:
接口是没有静态代码块或者构造方法的。
一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。
格式:
1 2 3
| public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB{
}
|
如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。
如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。
如果实现类所实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
一个类如果和直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类中的方法。
接口A:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.tipdm2.Demo01;
public interface MyInterfaceA {
public abstract void methodA();
public abstract void methodAbs();
public default void methodDefault(){ System.out.println("AAAAA"); } }
|
接口B:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.tipdm2.Demo01;
public interface MyInterfaceB {
public abstract void methodB();
public abstract void methodAbs();
public default void methodDefault(){ System.out.println("BBBBB"); } }
|
接口实现类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package com.tipdm2.Demo01;
public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB{ @Override public void methodA() { System.out.println("覆盖重写了A方法!"); }
@Override public void methodB() { System.out.println("覆盖重写了B方法!"); }
@Override public void methodAbs() { System.out.println("覆盖重写了AB接口都有的抽象方法!"); }
@Override public void methodDefault() { System.out.println("重写AB接口默认方法"); }
}
|
主类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package com.tipdm2.Demo01;
public class demo1 { public static void main(String[] args) { MyInterfaceImpl myInterface = new MyInterfaceImpl(); myInterface.methodA(); myInterface.methodB(); myInterface.methodAbs(); myInterface.methodDefault(); } }
|
1 2 3 4 5 6
| 覆盖重写了A方法! 覆盖重写了B方法! 覆盖重写了AB接口都有的抽象方法! 重写AB接口默认方法
进程已结束,退出代码0
|
一个类如果和直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类中的方法
接口:
1 2 3 4 5 6 7
| package com.tipdm2.Demo02;
public interface MyInterface { public default void method(){ System.out.println("接口当中的默认方法!"); } }
|
父类:
1 2 3 4 5 6 7
| package com.tipdm2.Demo02;
public class Fu { public void method(){ System.out.println("父类中的方法!"); } }
|
子类/方法实现类:
1 2 3 4
| package com.tipdm2.Demo02;
public class Zi extends Fu implements MyInterface{ }
|
主类:
1 2 3 4 5 6 7 8 9 10 11
| package com.tipdm2.Demo02;
public class demo1 { public static void main(String[] args) { Zi zi = new Zi(); zi.method(); } }
|
接口的多继承
父接口A:
1 2 3 4 5 6 7 8 9 10 11
| package com.tipdm2.Demo03;
public interface MyInterfaceA { public abstract void methodA();
public abstract void methodCommon();
public default void methodDefault(){ System.out.println("AAAA"); } }
|
父接口B:
1 2 3 4 5 6 7 8 9 10 11
| package com.tipdm2.Demo03;
public interface MyInterfaceB { public abstract void methodB();
public abstract void methodCommon();
public default void methodDefault(){ System.out.println("BBBB"); } }
|
子接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.tipdm2.Demo03;
public interface MyInterface extends MyInterfaceA, MyInterfaceB{ public abstract void method();
@Override default void methodDefault() { System.out.println("子接口默认方法"); } }
|
接口实现类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| package com.tipdm2.Demo03;
public class MyInterfaceImpl implements MyInterface{ @Override public void method() {
}
@Override public void methodA() {
}
@Override public void methodB() {
}
@Override public void methodCommon() {
} }
|
主类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package com.tipdm2.Demo03;
public class demo1 { public static void main(String[] args) { MyInterfaceImpl myInterface = new MyInterfaceImpl(); myInterface.method(); myInterface.methodA(); myInterface.methodB(); myInterface.methodCommon(); myInterface.methodDefault(); } }
|
1 2 3 4 5 6 7
| 子接口方法! A接口方法 B接口方法 公共接口方法 重写,子接口默认方法
进程已结束,退出代码0
|