欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Java】接口(interface)的定义和使用

程序员文章站 2022-04-01 10:15:37
...

【Java】接口(interface)的定义和使用

1.什么是接口

Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩容子类能力。
即:Java中使用抽象类/父类表示通用属性时,每个类只能继承一个类,假如子类已经从一个父类继承了,就不能再继续继承另外的父类。但每个类可以实现多个接口,这样子类就拥有了更多的能力。

微观概念:接口是一种能力和约定。

  • 接口的定义:代表了某种能力
  • 方法的定义:能力的具体要求

2.接口的语法

API(应用程序编程接口): Application Program Interface
接口相当于特殊的抽象类,定义方式、组成部分与抽象类类似。
接口的定义语法:

interface 接口名 { }

接口的定义要求:

  • 没有构造方法,不能创建对象
  • 只能定义:公开静态常量、公开抽象方法
public interface MyInterface {
    public static final String FIELD = "value";
    public abstract void method();
}
//public 关键字仅限用于接口在于其同名文件中被定义
interface MyInterface {
      // 公开静态常量(只能): public static final
      public static final String A = "hello";
      String D = "good"; // public static final 默认隐式存在、修饰
      
      // 公开抽象方法(只能): public abstract
      public abstract void method();
      void m(); // public abstract 默认隐式存在、修饰
}

接口与抽象类的【相同】:

  • 可编译为字节码文件(.class)
  • 不能创建对象(接口不是类,也没有构造方法)
  • 可以作为引用类型
  • 具备Object类中所定义的方法

接口与抽象类的【不同】:

  • 所有属性都只能且默认是公开静态常量,隐式使用public static final修饰
  • 所有方法都只能且默认是公开抽象方法,隐式使用public abstract修饰
  • 没有构造方法、没有动态/静态代码块

接口的使用语法:

    // 增加/赋予1种/多种能力(逗号分隔) [约定]
    calss Sub extends Super implements 接口名,接口名 {
        @OverRide
        public 返回值 method() { ... }
    }

3.接口的规范

  • 任何类在实现接口时,必须实现接口中所有的抽象方法,否则此类为抽象类。
  • 实现接口中抽象方法,访问修饰符必须是public。

4.接口引用

同父类一样,接口也可声明为引用,并指向真实类对象。
注意:

  • 使用接口引用作为方法形参,实现更自然的多态(只关注能力-具备能力的类对象均可传入)
  • 仅可调用接口中所声明的方法,不可调用实现类中独有的方法
  • 可强转回真实类本身类型,进行独有方法调用(注意判断真实类对象 instanceof)

接口引用的应用(伪代码示例-eclipse可编译运行)

/* (可编译通过的伪代码) */
// 使用接口引用作为方法形参,实现更自然的多态(只关注能力-具备能力的类对象均可传入)
public class TestApply {
      public static void main(String[] args) {
            // 接口应用伪代码
            System.out.println("接口应用伪代码");
      }
}
abstract classimplements 会漂浮的 {
      public abstract void 漂浮(); // 子类去覆盖
}
class 小舟 extends{
      public void 漂浮() {}
}
class 游艇 extends{
      public void 漂浮() {}
}
class 木筏 extends{
      public void 漂浮() {}
}
class 纸壳 {}
class 纸壳箱 extends 纸壳 implements 会漂浮的 {
      public void 漂浮() {
            System.out.println("纸壳箱通过胶带多次山绕,具备了可以承载重量后,漂浮在水面上");
      }
}
class 瓶子 {}
class 矿泉水瓶 extends 瓶子 implements 会漂浮的 {
      public void 漂浮() { }
}
class{}
class 大木头 extendsimplements 会漂浮的 {
      public void 漂浮() { }
}
class GameTeam {
//    public void 过汉江 (船 boat) {
      public void 过汉江 (会漂浮的 n) { // 使用接口引用作为方法形参,实现更自然的多态(关注行为、能力)
            System.out.println("n可以传入具备 会漂浮的 能力的对象均可-多态");
      }
}
interface 会漂浮的 {
      public abstract void 漂浮();
}

接口引用指向实现类对象,以及强转回实现类对象

/* interface.java */
// 定义了一种能力:会跑的
interface Runnable {
      public abstract void run();
}
// 定义了一种能力:会游的
interface Swimmable {
      public abstract void swim();
}
// 定义了一种能力:会爬的
interface Climbable {
      void climb();
}
// 定义了一种能力:会飞的
interface Flyable {
      void fly();
}
/* TestApplyInterface.java */
public class TestApplyInterface {
      public static void main(String[] args) {
            Animal a = new Dog(); // 多态:父类引用指向子类对象
            
            // 接口引用指向实现类对象,仅可调用接口中所声明的方法
            Runnable r = new Dog(); // 指向一个会跑的xxx
            r.run();
            r = new Cat();
            r.run();
            r = new Bus();
            r.run();
            
            // 接口引用可强转回类的真实对象,进行独有的属性和方法的调用
            if (r instanceof Bus) {
                  Bus b = (Bus)r;
                  System.out.println(b.seatNum);
            }
      }
}
class Animal{
      String breed;
      int age;
      String sex;
      
      public void eat() {}
      public void sleep() {}
}
// implements 接口名 : 增加/赋予一种能力 [约定]
class Dog extends Animal implements Runnable,Swimmable { // 实现--->落地
      String furColor;
      
      public void run() {
            System.out.println("狗在奔跑...");
      }
      @Override
      public void swim() {
            System.out.println("狗在游泳...");
      }
}
// implements 接口名,接口名 : 增加/赋予多种能力(逗号分隔) [约定]
class Cat extends Animal implements Runnable,Climbable{
      String furColor;
      
      public void run() {
            System.out.println("猫在奔跑...");
      }
      
      public void climb() {
            System.out.println("猫在爬树...");
      }
}
class Fish extends Animal{
      //public void swim() {}
}
class Bird extends Animal{
      //public void fly() {}
}
class Bus implements Runnable{
      int seatNum = 50;
      @Override
      public void run() {
            System.out.println("公交车在跑...");
      }
}

输出:
狗在奔跑…
猫在奔跑…
公交车在跑…
50

相关标签: Java