Java基础教程之接口的继承与抽象类

作者:junjie 时间:2023-11-06 20:47:22 

在实施接口中,我们利用interface语法,将interface从类定义中独立出来,构成一个主体。interface为类提供了接口规范。

在继承中,我们为了提高程序的可复用性,引入的继承机制。当时的继承是基于类的。interface接口同样可以继承,以拓展原interface。

接口继承

接口继承(inheritance)与类继承很类似,就是以被继承的interface为基础,增添新增的接口方法原型。比如,我们以Cup作为原interface:


interface Cup {
    void addWater(int w);
    void drinkWater(int w);
}


我们在继承Cup的基础上,定义一个新的有刻度的杯子的接口,MetricCup

Java基础教程之接口的继承与抽象类

接口如下:


interface MetricCup extends Cup
{
    int WaterContent();
}


我们增添了一个新的方法原型WaterContent(),这个方法返回一个整数(水量)。

interface的多重继承

在Java类的继承中,一个衍生类只能有一个基类。也就是说,一个类不能同时继承多于一个的类。在Java中,interface可以同时继承多于一个interface,这叫做多重继承(multiple inheritance)。

比如我们有下面一个Player接口:


interface Player
{
    void play();
}

我们新增一个MusicCup的接口。它既有Cup接口,又有Player接口,并增加一个display()方法原型。


interface MusicCup extends Cup, Player
{
    void display();
}

(如何使用interface,见实施接口)

抽象类

在生活中,我们会有一些很抽象的概念。这些抽象的概念往往是许多类的集合,比如:

1.粮食 (可以是玉米、小麦、大米)
2.图形 (可以是三角形、圆形、正方形)

再比如,我们之前举出了例子:

1.人类 (可以是男人、女人)

在组织这样的关系时,我们可以使用继承,比如:

Java基础教程之接口的继承与抽象类

根据我们的常识:

1."Food类的对象"的说法是抽象的。这样一个对象应该是属于Corn, Rice, Wheat子类中的一个。

2.Food类有eat()方法 (食物可以吃)。然而,这样的一个动作是抽象的。粮食的具体吃法是不同的。比如Corn需要剥皮吃,Wheat要磨成面粉吃。我们需要在每个类中覆盖Food类的eat()方法。

Java基础教程之接口的继承与抽象类

抽象与具体

Java中提供了抽象类(abstract class)的语法,用于说明类及其方法的抽象性。比如:


abstract class Food {
    public abstract void eat();
    public void happyFood();
    {
        System.out.println("Good! Eat Me!");
    }
}

类中的方法可以声明为abstract,比如上面的eat()。这时,我们不需要具体定义方法,只需要提供该方法的原型。这与接口类似。当我们在比如Corn类中继承该类时,需要提供eat()方法的具体定义。

类中的另一个方法happyFood()并不是

当一个类中出现abstract方法时,这个类的声明必须加上abstract关键字,否则Java将报错。一个abstract类不能用于创建对象。

抽象类的继承

我们可以像继承类那样继承一个抽象类。我们必须用完整的方法定义,来覆盖抽象类中的抽象方法,否则,衍生类依然是一个抽象类。

抽象类的定义中可以有数据成员。数据成员的继承与正常类的继承相同。

总结

interface继承,多重继承

abstract method, abstract类

标签:Java,基础教程,接口,继承,抽象类
0
投稿

猜你喜欢

  • Java迭代器与Collection接口超详细讲解

    2022-07-14 05:10:49
  • C#实现基于加减按钮形式控制系统音量及静音的方法

    2022-07-09 09:31:50
  • C# NetRemoting实现双向通信

    2022-07-01 14:05:58
  • java安全编码指南之:表达式规则说明

    2021-06-01 17:48:44
  • springboot基于Redis发布订阅集群下WebSocket的解决方案

    2023-07-14 04:37:45
  • 关于eclipse中运行tomcat提示端口被占用的4种解决

    2022-04-15 10:56:12
  • 基于c#用Socket做一个局域网聊天工具

    2023-08-17 09:36:14
  • Gradle:修改默认的Build配置文件名方式

    2023-11-28 20:18:01
  • c# 字符串操作总结

    2022-03-16 05:59:25
  • C#键值对容器的介绍

    2023-04-14 12:26:56
  • C#用链式方法表达循环嵌套

    2023-04-14 06:54:23
  • Android 自定义gradle property详解及实例代码

    2022-05-08 15:17:49
  • 深入理解Java Socket通信

    2022-10-03 04:56:10
  • Java线程池源码的深度解析

    2023-10-02 19:33:40
  • java 查找替换pdf中的指定文本

    2022-08-17 14:04:46
  • 配合Swagger使用绝佳的两款直观易用JSON可视化工具

    2021-10-14 23:50:23
  • IDEA自定义常用代码块及自定义快捷摸板

    2022-01-13 18:54:22
  • Android编程实现圆角边框布局效果的方法

    2021-06-07 08:54:01
  • 多线程如何解决for循环效率的问题

    2023-12-02 08:31:55
  • java获取当前时间并格式化代码实例

    2021-10-06 17:06:16
  • asp之家 软件编程 m.aspxhome.com