24.Java-接口

接口定义

接口定义一种规范,规定某以类事物必须具备某些功能,但是它不管类如果具体实现这些功能.

格式:[修饰符] interface 接口名 extends 父接口1,父接口2...
public interface IWalkable{
    void walk;
}
接口特点:
  • 没有构造方法,不能实例化
  • 接口只能继承接口,不能继承类,且接口支持多继承
  • 接口里的方法全是抽象的,默认修饰符是public abstract
  • 接口里的字段是全局静态变量,默认修饰符是public static final
  • 接口里的类全部是静态的,默认修饰符是public static
接口里的成员包括(一般使用前两个):
  • 全局静态变量:实现类中经常使用的通用常量
  • 公共的抽象方法:实现类中必须实现的公告方法
  • 公共静态内部类(包括内部类、内部接口、内部枚举)
提示:

可理解为接口是一种特殊类,习惯在接口名前加上大写的I,以区别分类和接口.

接口里定义的方法一般不写修饰符.

接口之间的多继承:
public interface IA{
    
    void methodA();
    
}

public interface IB{
    
    void methodB();
    
}

//接口IC的子类必须实现method和method
public interface IC extends IA,IB{
    
}
实现接口

接口是一种特殊的类,仅仅是定义了功能,必须有类去实现接口,才有意义。

格式:[修饰符] class 类名 implements 接口1、接口2

++实现接口(支持多实现):接口的实现必须在extends后;++

示例:
public class Tiger extends Animal implements IWalkable,ISwimable{
    
}

接口和实现类的关系,是一种继承关系,既实现类实现了接口。也可以称为是特殊的继承关系,实现类是接口的特殊子类,接口是实现类的特殊父类。

实现(覆写)接口的方法必须使用public访问修饰。

接口不能创建实例,但是可以声明引用类型的变量,此时,引用类型的变量必须指向到其实现类对象,其实就是父类变量引用子类对象。

IWalkable obj = new String();//错误
IWalkable obj = new Tiger();//多态

不建议一个实现类的多个接口里有同名字段和相同方法签名的方法。

提示:
  • 接口也是一种类型,子类的实例可以使用instanceOf来判断.
  • 父类和子类之间及接口和实现类之间的都可以描述多态,但是接口和实现类之间的多态才是我们开发中见到最多的情况.
public interface IWalkable{
    
    void walk();
    
}

public interface ISwimable{
    
    void swim();
    
}

public class Animal{
    
    String name;
    
}

//Tigerl类继承Animal,实现IWalkable 和ISwimable
public class Tiger extends Animal implements IWalkable,ISwimable{
    public void swim(){
        
    }
    
    public void walk(){
        
    }
}

public class Test(){
    public static void main(String[] args){
        Tiger  t = new Tiger();//实例化Tiger实例
        t.swim();//tiger实现了ISwimable接口,所以Tiger有swim方法
        Animal a = t;//Tiger是一种Animal,所以可以使用Animal类型引用
        a.name = "tiger";//Animal 没有实现IWalkable和ISwimable,不能swim和walk
        IWalkable w = t;//Tiger实现了IWalkable,所以能用IWalkable类型引用
    }
}
接口VS抽象类
相同点:
  • 都位于继承类的顶端,用于被其他子类或接口实现或继承
  • 都不能实例化
  • 都可以定义抽象方法,其非抽象子类必须覆写这些抽象方法
不同点
  • 接口没有构造方法,抽象类有构造方法
  • 抽象类可以包含普通方法和抽象方法,接口只能包含抽象方法
  • 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口(接口弥补了Java的单继承)
  • 变量:接口里默认是public static final,抽象类是默认包访问权限.
  • 方法:接口里默认是public abstract,抽象类默认是默认包访问权限
  • 内部类:接口里默认是public static,抽象类默认是默认包访问权限
二者的选用

优先选用接口,尽量少用抽象类,若需要定义子类行为,又要为子类提供共性功能时选用抽象类。

你可能感兴趣的:(24.Java-接口)