上篇小编讲到了抽象类,这篇小编将带领大家进入接口类,一起探索接口类的奥秘。
1.接口的概念
2.接口的语法
3.接口怎么用?
4.实现多个接口
5. 接口间的继承
一:接口的概念:
生活中我们可以遇到各种各样的接口,例如:电脑的usb接口、插座等等比比皆是。
电脑的USB口上,可以插:U盘、鼠标、键盘…所有符合USB协议的设备;
电源插座插孔上,可以插:电脑、电视机、电饭煲…所有符合规范的设备。
接口(Interface)是计算机科学中的一个核心概念,尤其在面向对象编程(OOP)中扮演着至关重要的角色。接口定义了一组规范或契约,这组规范或契约由一组方法(有时也包括属性、事件等,具体取决于编程语言)组成,但不提供这些方法的实现。接口的主要目的是指定一组方法,让不相关的类可以实现这些方法,从而确保这些类遵循相同的协议或标准。
二:接口的语法与特性:
1.抽象性:接口是抽象的,它只定义方法或属性的签名(即名称、参数列表和返回类型),而不提供具体的实现。实现接口的类必须提供接口中所有方法的具体实现。
2.多态性:通过接口,可以实现多态性。多态性允许我们以统一的接口来操作不同的对象,这些对象可以是接口的不同实现。这提高了代码的灵活性和可扩展性。
3.解耦:接口有助于实现高内聚低耦合的设计原则。通过定义接口,我们可以将类的实现细节与使用该类的代码分离开来,降低了系统各部分之间的依赖关系。
4.标准化:接口为不同的类提供了一种标准化的通信方式。只要类实现了某个接口,就可以保证它遵循了接口定义的规范,从而可以与其他遵循相同接口的类进行交互。
5.灵活性:接口允许我们在不修改现有代码的情况下,通过添加新的实现类来扩展系统的功能。这种能力使得系统更加灵活和易于维护。
6.强制实现:在某些编程语言中,接口可以强制实现接口的类必须提供接口中所有方法的具体实现,这有助于确保类的完整性和一致性。
特性:接口类型是一种引用类型,但是不能直接new接口的对象; 接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错);接口中的方法是不能在接口中实现的,只能由实现接口的类来实现;重写接口中方法时,不能使用默认的访问权限;接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量;接口中不能有静态代码块和构造方法;如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类。
java">public interface 接口名称{
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
public void method2();
abstract void method3();
void method4();
// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}
注意:
- 创建接口时, 接口的命名一般以大写字母 I 开头.
- 接口的命名一般使用 “形容词” 词性的单词.
- 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性.
- 三:接口的使用:接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法
java">public class 类名称 implements 接口名称{
// ...
}
//类与接口之间是implements实现关系
定义接口
java">public interface Animal { // 定义一个方法,但不提供实现 void eat(); // 接口中可以定义多个方法 void sleep();
}
创建类实现接口
java">public class Dog implements Animal { // 实现eat方法 @Override public void eat() { System.out.println("Dog is eating."); } // 实现sleep方法 @Override public void sleep() { System.out.println("Dog is sleeping."); } // Dog类还可以有自己的方法和属性 public void bark() { System.out.println("Dog is barking."); }
}
测试类
java">public class TestInterface { public static void main(String[] args) { // 创建Dog类的实例 Animal myDog = new Dog(); // 调用接口中定义的方法 myDog.eat(); // 输出: Dog is eating. myDog.sleep(); // 输出: Dog is sleeping. // 注意:我们不能直接调用Dog类特有的方法,除非我们将myDog的类型转换为Dog // ((Dog) myDog).bark(); // 如果需要调用bark(),可以这样显式转换类型 }
}
四:实现多个接口
java">// 定义第一个接口
interface Flyable { void fly();
} // 定义第二个接口
interface Swimmable { void swim();
} // 定义一个类实现Flyable和Swimmable接口
class Duck implements Flyable, Swimmable { // 实现Flyable接口中的fly方法 @Override public void fly() { System.out.println("Duck is flying."); } // 实现Swimmable接口中的swim方法 @Override public void swim() { System.out.println("Duck is swimming."); } // Duck类还可以有自己的方法和属性 public void quack() { System.out.println("Duck is quacking."); }
} // 测试类
public class TestMultipleInterfaces { public static void main(String[] args) { // 创建Duck类的实例 Duck myDuck = new Duck(); // 调用Flyable接口中的方法 myDuck.fly(); // 输出: Duck is flying. // 调用Swimmable接口中的方法 myDuck.swim(); // 输出: Duck is swimming. // 调用Duck类特有的方法 myDuck.quack(); // 输出: Duck is quacking. }
}
五:接口间的继承
在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。例如:
java">interface Irun{
void run();
}
interface Ifly{
voud fly();
}
//两栖类
interface IAmphibious extends Irun,Ifly{
}
interface Frog implements IAmphibious{
}
通过接口继承创建一个新的接口 IAmphibious 表示 “两栖的”. 此时实现接口创建的 Frog 类, 就继续要实现 run 方法, 也需要实现 fly方法.
java">// 定义第一个接口
interface Animal { void eat();
} // 定义第二个接口,继承自Animal接口
interface Mammal extends Animal { void nurseYoung();
} // 定义一个类实现Mammal接口,从而也间接实现了Animal接口
class Dog implements Mammal { // 实现Animal接口中的eat方法 @Override public void eat() { System.out.println("Dog is eating."); } // 实现Mammal接口中的nurseYoung方法 @Override public void nurseYoung() { System.out.println("Dog is nursing its young."); }
} // 测试类
public class TestInterfaceInheritance { public static void main(String[] args) { // 创建Dog类的实例 Dog myDog = new Dog(); // 调用从Animal接口继承的方法 myDog.eat(); // 输出: Dog is eating. // 调用Mammal接口特有的方法 myDog.nurseYoung(); // 输出: Dog is nursing its young. }
}