java:Java中的接口

什么是接口

概念:

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

   我的解释:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。(理解为一种特殊的类,里面全部是由全局常量公共的抽象方法所组成的)。接口是解决Java无法使用多继承的一种手段,但是接口在实际中的更多的作用是指定标准的。或者我们可以直接把接口理解为100%的抽象类,即接口中的方法必须全部是抽象方法。

 接口和类的区别:

接口(Interface)和类(Class)是 Java 中两种不同的概念,它们有一些重要的区别,主要包括以下几点:

定义:

  • 类是一种具体的实体,可以包含属性(字段)和方法的实现。
  • 接口是一种抽象的定义,只包含方法的声明而没有方法的实现

继承:

  • 类可以使用继承来扩展另一个类的属性和方法。
  • 接口可以通过实现(implements)来定义类的行为,一个类可以实现多个接口

多态性:

  • 类之间的多态性主要通过继承和方法重写来实现。
  • 接口之间的多态性主要通过接口的实现来实现,一个类可以实现多个接口,从而具有多个不同的行为

实例化:

  • 类可以被实例化为对象,对象可以调用类中定义的属性和方法。
  • 接口本身不能被实例化,但是可以通过实现接口的类来创建对象,并调用接口中定义的方法。

抽象性:

  • 类可以是抽象类(abstract class),包含抽象方法和普通方法。
  • 接口本身就是抽象的,所有方法都是抽象方法,不包含方法的具体实现。

多继承:

  • 类在 Java 中不支持多继承,即一个类只能继承一个父类
  • 接口支持多继承,一个类可以实现多个接口,从而获得多个接口的行为。

 接口的定义

在 Java 中,定义一个接口需要遵循以下步骤:

  1. 使用 interface 关键字声明接口,接口的命名通常使用首字母大写的驼峰命名规则。
  2. 在接口中定义需要暴露给外部的方法,方法声明只包含方法的签名,不包含方法体。方法可以包含参数和返回类型。
  3. 接口中的方法默认是公共的(public),可以省略 public 关键字。
  4. 接口中可以定义常量,常量默认是静态的和最终的(static final),可以省略这两个修饰符。
  5. 接口中的方法可以包含默认实现,使用 default 关键字进行声明。

   下面是一个简单的接口定义示例:

public interface Animal {
    // 定义一个抽象方法
    void eat(String food);

    // 定义一个默认方法
    default void sleep() {
        System.out.println("Animal is sleeping");
    }

    // 定义一个常量
    int LEGS = 4;
}

        在上面的示例中,定义了一个名为 Animal 的接口,包含了一个抽象方法 eat、一个默认方法 sleep 和一个常量 LEGS。接口中的方法和常量都是公共的,并且不需要使用 public 关键字进行修饰。


接口的特点

1.接口成员变量的特点:

接口中没有成员变量,只有公有静态常量。

即默认情况下属性前都会有public static final 这三个关键字修饰。如下:

public static final 数据类型 常量名=常量值;

初始化

final修饰的属性必须初始化,我们在接口中定义公有的静态常量时,必须在定义时就赋初值。(否则idea报错)。

演示:

正确的:

错误的:

 2.接口成员方法的特点:

     @.1在JDK7.0版本及之前版本中,接口中仅支持共有的抽象方法:

         public abstract 返回值类型 方法名();

     事实上,接口中的方法默认就是公有抽象方法,因此在接口中定义抽象方法时,可以省略掉abstract关键字

     @.2从JDK8.0开始,接口中可以由默认方法静态方法两种:
              默认方法——public default 返回值类型 方法名(){  }

              静态方法——public  static   返回值类型 方法名(){  }

         需要注意的是,想定义默认方法必须在前面添加default关键字,因为接口中的方法如果你什么都不写,默认是公有的抽象的方法。默认方法可以有方法体,且不需要实现类去实现,其实就是我们平时见到的普通的成员方法。但是默认方法是可以被实现类重写的。default关键字只能在接口中使用,就算实现类要重写默认方法,实现类中重写后的方法也不能添加default修饰符,不然IDEA报错。

      @.3JDK9.0以后,接口中可以有私有方法

              private  返回值类型  方法名(){  }

演示:

package Test1;

// 定义一个接口
interface Animal {
    void eat(); // 接口中的方法默认是public abstract的
    void sleep();
}

// 实现接口的类
class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("Dog is eating");
    }

    @Override
    public void sleep() {
        System.out.println("Dog is sleeping");
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat(); // 调用接口中的eat方法
        dog.sleep(); // 调用接口中的sleep方法
    }
}

运行结果:

  注意:如果想使用默认方法,一定不要忘记添加default关键字。 


3.接口构造方法的特点:

         接口的存在的目的是为了规范类,因此,接口也不可以被实例化。接口中不允许存在代码块,也没有需要初始化的成员,因此接口没有构造方法(构造器)。在接口中定义构造器IDEA会直接报错,如下图:


4.接口创建对象的特点:

     可以通过接口类型来引用实现接口的类的对象,从而实现多态性和灵活性。 

例如:

// 定义一个接口
interface Shape {
    double calculateArea(); // 计算面积的抽象方法
    double calculatePerimeter(); // 计算周长的抽象方法
}

// 实现接口的类:圆形
class Circle implements Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }

    @Override
    public double calculatePerimeter() {
        return 2 * Math.PI * radius;
    }
}

// 实现接口的类:矩形
class Rectangle implements Shape {
    private double length;
    private double width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    @Override
    public double calculateArea() {
        return length * width;
    }

    @Override
    public double calculatePerimeter() {
        return 2 * (length + width);
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle(5);
        System.out.println("Circle Area: " + circle.calculateArea());
        System.out.println("Circle Perimeter: " + circle.calculatePerimeter());

        Shape rectangle = new Rectangle(4, 6);
        System.out.println("Rectangle Area: " + rectangle.calculateArea());
        System.out.println("Rectangle Perimeter: " + rectangle.calculatePerimeter());
    }
}

运行结果:


 5.接口继承关系的特点:

 类和接口之间的关系 : 

  • 类与接口是实现关系,支持“多实现”,即一个类可实现多个接口。

  接口与接口之间的关系 : 

  • 接口与接口是继承关系,java 支持接口的多继承,即一个接口可以同时继承多个接口,           格式如下 : 
  •    接口 extends 接口1,接口2,接口3...

  继承和实现的区别 : 

  •         继承体现的是“is a”的关系,父类中定义共性内容。
  •         实现体现的是“like a”的关系,父接口中定义扩展内容。

        PS : 接口的“实现”可以看作是Java中对“单继承机制”的一个补充完善。接口可以在一定程度上实现代码解耦(接口规范性 + 动态绑定)。总的来看,接口的实现比类的继承更为灵活


总结

  1. 接口定义了一组抽象方法的规范,实现接口的类必须提供这些方法的具体实现。
  2. 接口中的方法默认是public和abstract的,可以省略这些修饰符。
  3. 接口可以包含常量,这些常量默认是public、static和final的。
  4. 类可以实现一个或多个接口,使用关键字implements。
  5. 一个类可以同时继承一个类(单继承)并实现多个接口(多实现)。
  6. 接口之间可以进行继承,一个接口可以继承另一个接口,使用关键字extends。
  7. 接口不能被实例化,但可以通过实现接口的类来创建对象。
  8. 接口提供了一种规范化的方式来实现多态性,可以通过接口类型引用实现接口的类的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蓝lanll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值