一个例子来让我们理解更加深刻
这是我们的整体文件布局
①A是接口
②B和C是用来实现接口的类
③show是我们的运行函数,用来展示
A接口
接口中定义的方法可以不用去实现,用其他类去实现(必须实现)
关键字:interface
public interface A { // public static final String str = "我是A接口"; 可简写为下面 理解为一个常量 String str = "我是A接口"; // public abstract void doa(); 可简写为下面 void doa(); }
B类(用来实现A接口)
关键字:implements
public class B implements A{ @Override public void doa() { System.out.println("我是B类"); } }
C类(用来实现A接口)
关键字:implements
public class C implements A{ @Override public void doa() { System.out.println("我是C类"); } }
定义完成后我们用我们的show来展示一些
show类
这里我们用了B类来实现我们的接口,因此调用显示为“我是B类”
public class show { public static void main(String[] args) { A a = new B(); a.doa(); } }
我们把B改成C试试
public class show { public static void main(String[] args) { A a = new C(); a.doa(); } }
显示的我是C类
所以我们就可以很方便的调用两个不同的方案来实现我们的功能,很方便
扩展
我们还可以在里面定义好函数,不用再去实现类中实现它(!!!注意和之前的区别,之前的不同,之前的是在实现类中必须实现)
/** * 1、默认方法:必须使用default修饰,默认会被public修饰 * 实例方法:对象的方法,必须使用实现类的对象来访问。 */ default void test1(){ System.out.println("===默认方法=="); test2(); } /** * 2、私有方法:必须使用private修饰。 * 实例方法:对象的方法。 */ private void test2(){ System.out.println("===私有方法=="); } /** * 3、静态方法:必须使用static修饰,默认会被public修饰 */ static void test3(){ System.out.println("==静态方法=="); }
接口可以继承多个
interface A{ void test1(); } interface B{ void test2(); } interface C{} //比如:D接口继承C、B、A interface D extends C, B, A{ }
但是实现的时候也必须全部实现
//E类在实现D接口时,必须重写D接口、以及其父类中的所有抽象方法。 class E implements D{ @Override public void test1() { } @Override public void test2() { } }