Java基础语法 接口(interface)的定义和实现


Java基础语法 接口(interface)的定义和实现

在学习接口之前,建议大家先熟悉一下前一篇文章对抽象的解释:Java基础语法 到底什么是抽象?,因为接口通俗的讲就是比抽象类更抽象的类,深入理解了抽象的概念之后,对学习接口会更有帮助。

1. 接口的定义

  • 第一种解释:接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的类 。

    接口只描述应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计。

  • 第二种解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

  • 第三种解释:有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。接口(interface)是抽象方法和常量值的定义的集合。

  • 第四种解释:接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

    1. 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

    2. 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

    3. 接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象上,这就是通过接口实现多态的关键。

      //这里解释的有些生硬,我们通过下面这个案例来解释一下“接口类型可用来声明一个变量”
      //抽象类 Fu类
      public interface Fu {
           void function();
      }
      //子类实现父类
      public class Zi implements Fu {
      	//子类实现父类需要实现父类的抽象方法
          @Override
          public void function() {
              System.out.println("重写父类方法");
          }
      }
      //孙子类
      public class Sun {
          //孙子类定义方法需要传入Fu对象
          public void Fun(Fu fu){
              System.out.println("测试");
          }
      }
      //测试类
      public class Test {
          public static void main(String[] args) {
              //多态的实现:父类的引用指向子类的对象
              Fu fu = new Zi();
              fu.function();
              Sun sun = new Sun();
              //传入的参数是父类的引用,实际传入的是子类的对象
              sun.Fun(fu);
              System.out.println(fu);
          }
      }
      
      

      打印结果:

      重写父类方法
      测试
      com.test.Zi@15aeb7ab

      2. 接口的声明与实现

//声明接口
[public/缺省] interface 接口名称 [extends 其他的接口名] {
        // 声明变量(默认为常量)
        // 抽象方法
}
//示例代码如下:
public interface Fu {
    int a = 0;//定义的变量默认被static和final修饰,必须赋初值。
     void function();
}

//实现接口
...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...
//示例代码如下:
public class Zi implements Fu {
    @Override
    public void function() {
        System.out.println("重写父类方法");
    }
}

3. 接口的特点

  • 接口可以理解成统一的协议, 而接口中的属性也属于协议中的内容。但是接口的属性都是公共的,静态的,最终的。接口的成员特点:

    1、成员变量只能是常量,默认修饰符 public static final,使用变量的时候,变量必须被赋值。

    2、成员方法只能是抽象方法。默认修饰符 public abstract

  • 接口不可以创建对象。

  • 多个无关的类可以实现同一个接口。

  • 一个类可以实现多个无关的接口(多实现),例如:public class Hockey implements Sports, Event。

  • 接口之间可以多继承,例如:public interface Hockey extends Sports, Event。

  • 与继承关系类似,接口与实现类之间存在多态性。

  • 接口也可以继承另一个接口,使用extends关键字。

  • 接口没有构造方法,不能被实例化。

  • 子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类。

/*
 * 接口的成员特点:
 *         只能有抽象方法
 *         只能有常量
 *         默认使用public&abstract修饰方法
 *         只能使用public&abstract修饰方法
 *         默认使用public static final来修饰成员变量
 * 
 * 建议:建议大家手动的给上默认修饰符
 * 
 * 注意:
 *         接口不能创建对象(不能实例化)
 *         类与接口的关系是实现关系,一个类实现一个接口必须实现它所有的方法,否则子类也无法实例化。
 
 */

//测试类
public class InterfaceDemo {
    public static void main(String[] args) {
        //Animal a = new Animal();//创建对象报错
        //Animal.num;//调用常量
        //Cat cat = new Cat();//创建子类对象
    }
}
 
 //接口类
interface Animal {
    //定义变量
    public static final int num = 10;
    //定义抽象方法
    public abstract void eat();
}
//子类实现接口类
class Cat implements Animal {
    //重写父类方法
    public void eat() {
        
    }
}
  • 注意(无关紧要,知道就行):

    ①在 JDK8,允许我们给接口添加两种非抽象的方法实现:

    1、默认方法,添加 default 修饰即可;

    2、静态方法,使用 static 修饰即可;

    示例如下:

    interface Test{
        //这个是默认方法
        default String get(String aa){
            System.out.println("我是jdk1.8默认实现方法...");
            return aa;
        }   
        //这个是静态方法    
        static void staticmethod(){
            System.out.println("我是静态方法");
        }
    }

    调用得话,静态方法只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用,default 方法只 能通过接口实现类的对象来调用。

    ②在 JDK9之后,允许我们给接口添加私有方法。

4. 接口与类的关系

  • 类与类之间: 继承关系,一个类只能直接继承一个父类,但是支持多重继承
  • 类与接口之间: 只有实现关系,一个类可以实现多个接口
  • 接口与接口之间: 只有继承关系,一个接口可以继承多个接口

5. 接口和抽象类的区别

  • 共性:不断的进行抽取,抽取出抽象的没有具体实现的方法,都不能实例化(不能创建对象)

  • 区别

    1. 与类的关系

      类与接口是实现关系,而且是多实现,一个类可以实现多个接口;

      类与抽象类是继承关系,Java中的继承是单一继承,多层继承,一个类只能继承一个父类,但是可以有爷爷类。

    2. 成员的区别

      a.成员变量

      抽象类可以有成员变量,也可以有常量
      接口只能有常量,默认修饰符public static final

      b.成员方法

      抽象类可以有抽象方法,也可以有非抽象方法
      接口只能有抽象方法,默认修饰符 public abstract

      c.构造方法

      抽象类有构造方法,为子类提供
      接口没有构造方法

文章作者: 刘磊
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 刘磊 !
  目录