接口
一、接口的语法
语法:
public interface 接口名{
// 定义的属性都是公有静态常量
// 定义的方法都是公有抽象方法
}
// 不能直接创建对象 public interface MyInterface { // 定义的所有属性都是公有静态常量public static final String name = "name"; // 定义的普通方法默认为公有抽象方法 void m1(); }
二、与抽象类的异同
相同:
可以作为引用类型
不能创建对象
具有Object类的方法
区别:
接口中定义的属性,即使不加任何修饰符,也是公有静态常量。
定义的普通方法默认为公有抽象方法。
不能定义构造方法
不能定义静态代码块、动态代码块
经典面试题:接口和抽象类的区别。
三、接口的概念
接口是一种能力和约定。一般适用于使用多态,但是又无法抽取is a关系来定义父类的情况,使用接口定义某种能力,来实现多态。
public class Demo1 { // 假设要进行庆典活动,准备一场飞行表演 public static void main(String[] args) { Day day = new Day(); Flyable plane = new Plane(); day.show(plane); Flyable bird = new Bird(); day.show(bird); } }
// 具备飞行能力 public interface Flyable { void fly(); } public class Plane implements Flyable{ @Override public void fly() { System.out.println("飞机在进行飞行表演..."); } } public class Bird implements Flyable{ @Override public void fly() { System.out.println("鸽子在进行飞行表演..."); } } // 节日表演 public class Day { public void show(Flyable f) { System.out.println("庆典开始"); f.fly(); } }
四、利用接口来补充多继承的缺失
接口中的方法没有实现,可以使用类来实现多个接口。
public interface A { void m1(); } public interface B { void m1(); } public class D { } public class C extends D implements A, B{ @Override public void m1() { System.out.println("c===m1"); } }
五、接口的继承
接口可以继承其他接口,且可以继承多个接口。
public interface A { String name = "A"; void m1(); void m3(); } public interface B { String name = "B"; void m2(); void m3(); } public interface C extends A, B{ void m4(); } public class D implements C{ @Override public void m1() { } @Override public void m3() { } @Override public void m2() { } @Override public void m4() { } } public class Demo1 { public static void main(String[] args) { // System.out.println(C.name); // 会报错,二义性 System.out.println(A.name); System.out.println(B.name); } }
接口多态的案例:
public abstract class Animal { public abstract void eat(); // 吃 public abstract void sleep(); // 睡 } public interface Runnable { void run(); // 跑 } public interface Swimmable { void swim(); // 游 } public class Dog extends Animal implements Swimmable, Runnable { @Override public void run() { } @Override public void swim() { } @Override public void eat() { } @Override public void sleep() { } } public class Demo1 { public static void main(String[] args) { Dog dog = new Dog(); // 可以调用全部的4个方法 Animal a = dog; // 只能调用动物类中定义的eat和sleep两个方法 Runnable r = dog; // 只能调用run方法 Swimmable s = dog; // 只能调用swim方法 } }
六、常量接口
在项目中往往会有很多常量需要使用,而在接口中定义的变量默认为常量,所以接口用来定义常量非常适合。在项目用来定义常量的接口称为常量接口,里面可能没有任何方法。
public interface Constants { int PAGE_SIZE = 10; // 每页显示的条数 String FILE_BASE_PATH = "D:/images/"; // 文件上传时存放的路径 }