Java接口使用细节
1)接口不能被实例化。
2)接口中所有的方法是public方法,接口中抽象方法可以不用abstract修饰。
3)一个普通类实现接口,就必须将接口里的所有方法实现。
4)抽象类实现接口,可以不用实现接口里的方法。
5)一个类可以同时实现多个接口。
6)接口中的属性只能是final的,而且是public static final 修饰符。
//例如
interface A{
int a = 10; //实际是public static final,且必须初始化。
}
7)接口中属性的访问形式:接口名.属性名
8)一个接口不能继承其它的类,但可以继承多个别的接口。
//举例
interface B{ };
interface C{};
interface A extends B,C{};
9)接口的修饰符只能是public和默认,这点和类的修饰符是一样的。
区分接口与继承
在面向对象编程(OOP)中,接口(Interface)和继承(Inheritance)是两个重要的概念,用于实现代码的重用和扩展性。然而,它们之间有一些关键的区别。
继承(Inheritance)
- 定义:继承是面向对象编程中的一个主要特性,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。
- 特点:
- 子类可以访问父类的所有公共和保护成员(属性和方法)。
- 子类可以重写父类的方法(通过提供自己的实现)。
- 继承可以实现代码的重用和扩展性。
- 继承是“is-a”关系的一个表示,即子类“是”父类的一种特殊类型。
- 使用场景:当你想要创建一个新类,而这个类与另一个已存在的类有很多相似之处时,你可以使用继承。
接口(Interface)
- 定义:接口是一种完全抽象的类,它只包含抽象方法和常量的集合。一个类可以实现一个或多个接口,从而必须提供接口中所有方法的实现。
- 特点:
- 接口不能被实例化。
- 接口中的方法都是抽象的,没有方法体。
- 一个类可以实现多个接口。
- 接口是“has-a”关系的一个表示,即一个类“有”接口所定义的某些行为或属性。
- 接口提供了一种方式来定义一组方法的契约,而无需关心这些方法的具体实现。
- 使用场景:
- 当你想要确保某个类具有一组特定的方法时,可以使用接口。
- 当你想实现多重继承的效果(但大多数面向对象语言不支持多重继承)时,可以使用接口。
- 接口是实现插件式架构或组件化编程的基础。
接口与继承的对比
- 灵活性:接口比继承更灵活。一个类可以实现多个接口,但只能继承一个类(在大多数面向对象语言中)。
- 耦合度:继承通常会增加类之间的耦合度,因为子类依赖于父类的实现。而接口只定义了方法的契约,不关心实现,因此减少了耦合度。
- 扩展性:接口允许在不修改现有代码的情况下添加新的行为。而继承在添加新功能时可能需要修改父类或子类。
- 复用性:虽然继承可以实现代码重用,但接口通过定义方法的契约来实现更高级别的复用,因为它允许不同的类以相同的方式实现这些方法。
- 目的:继承主要用于实现代码重用和扩展现有类的功能。而接口主要用于定义一组方法的契约,并确保实现该接口的类都遵循这些契约。
接口的多态
接口多态特性
1)多态参数
在前面的Usb接口案例,Usb usb既可以接收手机对象,又可以接收相机对象,就体现了接口的多态。(接口引用可以指向实现了接口的类的对象)
2)多态数组
package com.Interface; public class InterfacePloyFace { public static void main(String[] args) { IF[] ifs = new IF[2]; ifs[0] = new Phone_(); ifs[1] = new Camera_(); for (int i = 0; i < 2; i++) { ifs[i].work(); //判断,向下转型 if(ifs[i] instanceof Phone_){ ((Phone_) ifs[i]).call(); } } } } interface IF{ void work(); } class Phone_ implements IF{ @Override public void work() { System.out.println("手机开始工作..."); } public void call(){ System.out.println("手机通话中..."); } } class Camera_ implements IF{ @Override public void work() { System.out.println("相机开始工作..."); } }
3)接口多态传递
package com.Interface; public class InterfacePloyPass { public static void main(String[] args) { Gi aa = new AA(); //Gi继承了Hi,则AA实现Gi的同时也实现了Hi Hi bb = new AA(); } } interface Hi{}; interface Gi extends Hi{}; class AA implements Gi{};