- 接口使用interface来定义
- Java中,接口和类是并列的两个结构
- 如何定义接口:定义接口中的成员
- JDK7及以前: 只能定义全局常量和抽象方法
- 全局常量: public static final的
- 抽象方法: public abstract的
- JDK8: 除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(暂略)
- JDK7及以前: 只能定义全局常量和抽象方法
- 接口中不能定义构造器!意味着接口不可以实例化
- Java开发中, 接口通过让类去实现( implements )的方式来使用。如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化。如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类
interface Flyable{
public static final int MAX_SPEED = 7900;
int MIN_SPEED = 1;//省略了public static final
public abstract void fly();
void stop();//省略了public abstract
}
interface Attackable{
public abstract void attack();
}
class Bullet extends Object implements Flyable,Attackable{
public void attack() {
}
public void fly() {
}
public void stop() {
}
}
- Java类可以实现多个接口 —>弥补了Java单继承性的局限性
格式: class AA extends BB implements CC,DD,EE… - 接口与接口之间可以继承,而且可以多继承
- 接口的具体使用,体现多态性
- 接口,实际上可以看做是一种规范
Java 8中接口的新特性:
package com.atguigu.java;
public class SubClassTest {
public static void main(String[] args) {
SubClass c = new SubClass();
// c.method1();//The method method1() is undefined for the type SubClass
// SubClass.method1();//The method method1() is undefined for the type SubClass
//接口中定义的静态方法,只能通过接口来调用
CompareA.method1();
//通过实现类的对象,可以调用接口中的默认方法
//如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法
c.method2();//SubClass: B
//如果子类(或实现类)继承的父类和实现的接口声明了同名同参数的方法
//那么子类在没有重写此方法的情况下,默认调用的是父类中同名同参数的方法--->方法的类优先原则
c.method3();//SuperClass: C
c.myMethod();
}
}
class SubClass extends SuperClass implements CompareA{
public void method2() {
System.out.println("SubClass: B");
}
//在子类的方法中调用父类(接口)中被重写的方法
public void myMethod() {
super.method3();//父类
CompareA.super.method3();//接口
}
}
interface CompareA{
public static void method1() {
System.out.println("A");
}
public default void method2() {
System.out.println("A");
}
default void method3() {
System.out.println("A");
}
}
class SuperClass{
public void method3() {
System.out.println("SuperClass: C");
}
}