一文读懂Java接口

发布于:2023-01-04 ⋅ 阅读:(358) ⋅ 点赞:(0)

一、浅析java接口

         java接口是java语言中存在的一种特定结构,它有其特定的语法结构。其声明语法格式如下

[可见度] interface 接口名称 [extends 其他的接口名] {
        // 声明变量
        // 抽象方法
}

        Interface关键字用来声明一个接口。下面是接口声明的一个简单例子。

import java.lang.*;
//引入包
public interface NameOfInterface
{
   //任何类型 final, static 字段
   //抽象方法
}

        关于接口,重点需要注意以下两点,接下来我分两部分详细说明。

二、接口与类

        编写接口的方式与类相似,但接口不同于类。简单来说,二者最本质的区别便是类描述对象的属性和方法,而接口则包含类要实现的方法。二者的异同总结如下:

        首先说相似处,一个接口中可以有多个方法,例如下方代码所示:

interface Person {
   public void eat();
   public void drink();
}

        另外,接口文件保存在 .java 结尾的文件中,文件名使用接口名。同时接口的字节码文件保存在 .class 结尾的文件中,接口相应的字节码文件必须在与包名称相匹配的目录结构中。

        接口与类的不同之处主要有:

  • 接口不能用于实例化对象;
  • 接口没有构造方法;
  • 接口中所有的方法必须是抽象方法,Java 8 之后接口中可以使用 default 关键字修饰的非抽象方法;
  • 接口不能包含成员变量,除了 static 和 final 变量;
  • 接口不是被类继承了,而是要被类实现;
  • 接口支持多继承。

三、接口的实现~

        接口无法被实例化,但可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。

接口的实现~~(用implements关键字)

...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...

 举个栗子!!

public class talent implements Person{
 
   public void eat(){
      System.out.println("talents eats");
   }
 
   public void drink(){
      System.out.println("talents drink");
   } 
 
   public int noOfLegs(){
      return 0;
   }
 
   public static void main(String args[]){
      talents t = new talents();
      t.eat();
      t.drink();
   }
}

  四、为啥使用接口?

         作为一个纯小白,在自学期间就在思考一个问题,为啥就非得使用接口呢?用类不也可以实现同样的效果吗??(我不理解)关于这点,在一番求学后,才后知后觉,现对此做以下解释:

        

        (出自:接口是什么?为什么要使用它?_渣渣猪的博客-CSDN博客_接口是什么 )

        通俗来说便是,在Java 编程领域中,接口可以为不同类顺利交互提供标准。

        例如:老师让学生张三和李四一起完成,java 程序来模拟营业员和计算器的行为。张三和李四进行工作分工,张三写计算机器,李四写营业员类。

        张三先定义了一个计算器类 Calculator 类并提供计算的方法:

public class Calculator{
    public double count(double salary,double bonus){
        return salary+bonus;
    }
}

        李四定义了代表营业员的 Seller 类:

class Seller{
    String name;// 营业员的名称
    Calculator calculator;
    public Seller(String name, Calculator calculator) {
        super();
        this.name = name;
        this.calculator = calculator;
    }
    // 计算的方法
    public void quote(double salary,double bonus){
        System.out.println(name+"说:您好:请支付"+calculator.countMoney(salary, bonus)+"元。");
    }
}

        可以看出,李四开发的时候想使用张三已经写好的计算器的类,李四想当然的认为计算钱的方法是 countMoney, 但是张三写计算器的时候使用的方法是 count, 那么李四写的 Seller 类就是错误的。

        为了保证张三和李四的书写的类可以正确的完成交互,李四定义了一个接口,并要求张三必须实现这个接口,接口的代码如下:

interface Icount{
    public double countMoney(double salary,double bonus);
}

        那么张三的代码就应该是如下的:

public class Calculator implemenets Icount{
    public double countMoney(double salary,double bonus){
        return salary+bonus;
    }
}

        这样李四的代码就可以正常的执行了,看到这里,是不是明白了接口的强大之处呢?其实对以上实例,按个人理解,接口就相当于一条约束,方便代码之间的交互。

        关于接口的功能,除此之外,它还可以降低类之间的依赖性,提高代码的独立性。比如,张三现在觉得计算器类的名字改成 SuperCalculator 更合适,那么张三写的类代码就应该如下:

public class SuperCalculator implements Icount{
    public double countMoney(double salary,double bonus){
        return salary+bonus;
    }
}

        李四的代码如下:

class Seller{
    String name;// 营业员的名称
    Icount calculator; // 这里使用接口声明
    public Seller(String name, Calculator calculator) {
        super();
        this.name = name;
        this.calculator = calculator;
    }
    // 计算的方法
    public void quote(double salary,double bonus){
        System.out.println(name+"说:您好:请支付"+calculator.countMoney(salary, bonus)+"元。");
    }
}

        因此,张三的类无论命名成什么李四的代码都不需要改,所以代码的依赖性降低,便于程序的维护。(取自博客:为什么要使用接口-java - 别再闹了 - 博客园

        这就是接口的强大之处,也是它必不可少的重要程度的影射体现。

五、接口的继承

        接口的继承使用extends关键字,子接口继承父接口的方法。一个接口能继承另一个接口,和类之间的继承方式比较相似。举例如下:

public interface Sports
{
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}
 
public interface Football extends Sports
{
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}
 
public interface Hockey extends Sports
{
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}

        Football接口自己声明了三个方法,从Sports接口继承了两个方法,这样,实现Football接口的类需要实现六个方法。相似的,实现Hockey接口的类需要实现六个方法,其中两个来自于Sports接口。

        在Java中,类的多继承是不合法,但接口允许多继承。在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:

public interface Hockey extends Sports, Event

 六、标记接口

        最常用的继承接口是没有包含任何方法的接口。标记接口的作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。

package java.util;
public interface EventListener
{}

        标记接口主要用于以下两个目的:

  • 建立一个公共的父接口:正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。
  • 向一个类添加数据类型:这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到