什么是接口
概念:
官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
我的解释:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。(理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成的)。接口是解决Java无法使用多继承的一种手段,但是接口在实际中的更多的作用是指定标准的。或者我们可以直接把接口理解为100%的抽象类,即接口中的方法必须全部是抽象方法。接口和类的区别:
接口(Interface)和类(Class)是 Java 中两种不同的概念,它们有一些重要的区别,主要包括以下几点:
定义:
- 类是一种具体的实体,可以包含属性(字段)和方法的实现。
- 接口是一种抽象的定义,只包含方法的声明而没有方法的实现。
继承:
- 类可以使用继承来扩展另一个类的属性和方法。
- 接口可以通过实现(implements)来定义类的行为,一个类可以实现多个接口。
多态性:
- 类之间的多态性主要通过继承和方法重写来实现。
- 接口之间的多态性主要通过接口的实现来实现,一个类可以实现多个接口,从而具有多个不同的行为。
实例化:
- 类可以被实例化为对象,对象可以调用类中定义的属性和方法。
- 接口本身不能被实例化,但是可以通过实现接口的类来创建对象,并调用接口中定义的方法。
抽象性:
- 类可以是抽象类(abstract class),包含抽象方法和普通方法。
- 接口本身就是抽象的,所有方法都是抽象方法,不包含方法的具体实现。
多继承:
- 类在 Java 中不支持多继承,即一个类只能继承一个父类。
- 接口支持多继承,一个类可以实现多个接口,从而获得多个接口的行为。
接口的定义
在 Java 中,定义一个接口需要遵循以下步骤:
- 使用
interface
关键字声明接口,接口的命名通常使用首字母大写的驼峰命名规则。- 在接口中定义需要暴露给外部的方法,方法声明只包含方法的签名,不包含方法体。方法可以包含参数和返回类型。
- 接口中的方法默认是公共的(public),可以省略
public
关键字。- 接口中可以定义常量,常量默认是静态的和最终的(
static final
),可以省略这两个修饰符。- 接口中的方法可以包含默认实现,使用
default
关键字进行声明。下面是一个简单的接口定义示例:
javapublic 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 这三个关键字修饰。如下:
javapublic 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 返回值类型 方法名(){ }
演示:
javapackage 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.接口创建对象的特点:
可以通过接口类型来引用实现接口的类的对象,从而实现多态性和灵活性。
例如:
java// 定义一个接口 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中对"单继承机制"的一个补充完善。接口可以在一定程度上实现代码解耦(接口规范性 + 动态绑定)。总的来看,接口的实现比类的继承更为灵活。
总结
- 接口定义了一组抽象方法的规范,实现接口的类必须提供这些方法的具体实现。
- 接口中的方法默认是public和abstract的,可以省略这些修饰符。
- 接口可以包含常量,这些常量默认是public、static和final的。
- 类可以实现一个或多个接口,使用关键字implements。
- 一个类可以同时继承一个类(单继承)并实现多个接口(多实现)。
- 接口之间可以进行继承,一个接口可以继承另一个接口,使用关键字extends。
- 接口不能被实例化,但可以通过实现接口的类来创建对象。
- 接口提供了一种规范化的方式来实现多态性,可以通过接口类型引用实现接口的类的对象。