一、接口
在Java中,接口(interface)是一个定义了一组抽象方法的抽象类型。它类似于类,但是它只定义了方法的签名而不提供方法的实现。接口可以看做是一种协议或契约,定义了一些方法,但不规定这些方法的具体实现。实现接口的类必须要提供这些方法的具体实现。
在接口中定义的方法默认都是公共的,抽象的,不可实例化的。接口中也可以定义常量和默认方法。常量在接口中是隐式的public static final
,默认方法则是在Java 8中引入的,它们允许接口有默认的实现,而不需要实现类来提供具体的实现。
Java中的接口可以被类实现(implements)来实现接口中的所有方法。一个类可以实现多个接口,通过实现多个接口,可以获得多态的效果。这意味着不同的实现类可以实现相同的接口,从而可以交替使用。
接口的主要作用是实现代码的解耦,即接口定义了规范和约束,实现类需要按照接口的规范来实现接口中的方法。这样可以提高代码的灵活性和可扩展性,使得代码更加容易维护和修改。另外,接口也常常用于实现回调和依赖注入等设计模式,从而增加了代码的灵活性和可扩展性。
PS:很复杂对吧 举个简单的例子
当我们在开发一个游戏时,可能需要定义多个角色类,比如战士、法师、牧师等。这些角色都会有不同的属性和方法,比如战士会有攻击和防御属性,而法师则会有魔法攻击属性。这时候我们可以使用接口来定义这些角色的共同特征。
我们可以定义一个角色接口,包含所有角色所需实现的方法,比如攻击和防御,我们定义它的攻击和防御方法,然后在每个角色类中实现这些方法,以满足游戏的需求。
在上述代码中,我们定义了一个 Role
接口,其中包含了攻击和防御两个方法。然后我们通过实现该接口来定义不同的角色类,例如 Warrior
类和 Mage
类。最后在 Game
类中创建了一个战士对象和一个法师对象,分别调用它们的 attack()
方法,输出了不同的结果。
这个例子展示了如何使用接口定义角色类的共同特征,实现代码的重用和可扩展性。
PS:再举一个例子(这个例子可以不理解)
当我们写程序时,常常需要实现一些特定的功能,例如连接数据库、发送邮件等。但是我们不希望直接在代码中直接实现这些功能,而是希望通过接口来实现这些功能。比如,我们可以定义一个“数据库连接器”的接口,它包含了一些必须实现的方法,例如连接数据库、执行SQL查询等。这个接口可以被不同的数据库连接器实现,比如MySQL连接器、Oracle连接器等。
在上面的示例中,我们定义了一个DatabaseConnector
接口,并定义了一些必须实现的方法。然后,我们分别实现了一个MySQLConnector
和一个OracleConnector
,它们都实现了DatabaseConnector
接口,并实现了接口中的方法。
通过这种方式,我们可以实现多态性,即在不同的情况下使用不同的数据库连接器来连接数据库、执行SQL查询等操作,而不需要改变代码的其他部分。同时,也可以方便地切换数据库连接器,实现代码的灵活性和可维护性。
二、抽象类
抽象类(Abstract Class)是一种特殊的类,它不能被实例化,只能被继承。抽象类中可以定义抽象方法,这些方法没有实现代码,只是定义了方法的签名。抽象类中也可以定义普通方法,这些方法有实现代码。
抽象类主要用于定义一些通用的抽象方法和属性,让其子类去实现具体的功能。抽象类通常被用来作为其他类的父类,它的子类必须实现抽象方法,否则子类也必须声明为抽象类。
抽象类的特点:
-
抽象类不能被实例化,只能被继承。
-
抽象类可以包含抽象方法和普通方法。
-
抽象类中的抽象方法没有实现代码,只是定义了方法的签名。
-
抽象类中的普通方法有实现代码,可以直接调用。
-
抽象类的子类必须实现所有的抽象方法,否则子类也必须声明为抽象类。
-
抽象类可以包含成员变量、静态变量、常量和构造方法。
在抽象类中声明抽象方法的语法如下:
在接口中声明抽象方法的语法如下:
例如:
上面的代码定义了一个抽象类 Shape,包含一个私有成员变量 color 和一个抽象方法 getArea(),表示计算图形的面积。由于 Shape 是一个抽象类,不能被实例化,因此 getArea() 方法必须在子类中实现。子类可以是具体的图形类,如 Circle、Rectangle 等。下面是一个 Circle 类的示例:
测试一下:
总的来说,多态是指同一个方法可以在不同的对象上产生不同的行为。简单来说,就是同一个方法可以根据不同的对象参数产生不同的结果。
举个例子,假设有一个"动物"类,它有一个"发出声音"的方法。"狗"和"猫"都是"动物"的子类,它们重写了"发出声音"方法,但是"狗"发出"汪汪"声音,"猫"发出"喵喵"声音。那么当我们调用"发出声音"方法时,具体是什么声音,取决于我们所操作的对象是"狗"还是"猫"。
在这个例子中,"动物"类就是父类,而"狗"和"猫"是它的子类。子类重写了父类的方法,产生了不同的行为,这就是多态的体现。通过多态的使用,我们可以编写出更加灵活、可扩展的程序。
欢迎评论区留言指教 欢迎提问