专业编程基础技术教程

网站首页 > 基础教程 正文

Java 17 继承(java面向对象 - 封装、继承和多态)

ccvgpt 2024-07-28 12:23:31 基础教程 5 ℃

Java 17 继承

思维导图

继承是面向对象的三大特征之一,也是对于软件开发中复用的重要手段。

在 Java 中继承是单向继承, 且每个子类只能有一个直接父类。对于继承来说需要知道的关键字就是 extends。

Java 17 继承(java面向对象 - 封装、继承和多态)

语法格式如下:

[修饰符] 类名 extends 父类{
    //一些其他的代码
}

父类也有称其为超类,基类,都是父类的意思。

直接上实例:

先创建 BaseClass.java 文件, 并填写如下代码:

public class BaseClass {
    BaseClass(){
        System.out.println("调用了父类的构造方法。");
    }
}

创建 SubClass.java 文件, 代码如下:

public class SubClass extends BaseClass{
    //什么都不写。   
}

编写单元测试:SubClassTest.java

对于这个例子, 只是子类 SubClass 继承了父类 BaseClass 并在这里我们看到第一个继承特性, 子类中并没有写任何的代码, 但是在执行该单元测试时, 却显示了调用了父类的构造方法, 说明在子类的调用过程中父类的代码也会执行, 那执行顺序是什么样的呢?

我们调整代码在 SubClass 中创建构造方法。

SubClass(){
    System.out.println("调用了 SubClass 的构造方法");
}

最终修改的代码如下:

可以看到上面的执行顺序, 在调用子类的构造方法之前,发现有父类, 先调用了父类的构造方法,然后继续执行子类构造方法。

对于继承一般来说可以访问父类相关的变量,方法。

使用一个例子来验证。 比方说现在电商举行的活动。 双 11 刚刚过去, 现在双 12 又来了。电商里面做的最多的就是活动。 活动一般呢, 有分为满减, 满送等。 这个时候, 我们就可以使用继承进行代码的优化。

为什么有父类, 就是父类有子类的相关特性, 公共的特性,对于活动有什么活动共性呢? 活动的开始时间和结束时间,活动的状态要有, 活动的类型要有。这些都可以被称为只要有活动必有的属性。

创建活动的父类:ActiveBase.java

这里只模拟显示活动信息,以及判断是否活动开始了。

编写满额减活动的类, 父类来自活动这个类,这里图方便, 就直接在构造函数中初始化了数据,代码如下:

编写单元测试:

这里就可以看到, 子类可以直接使用父类的方法。现在又来了一个活动这次不用满额减了, 要使用满额送。 编写起来就很简单了。

定义满额送的类: ActiveSend.java

修改单元测试:

编译执行单元测试:

方法的重载

如果现在满额送判断活动是否开始不需要管活动的开始和结束时间, 只需要判断有效就可以参与活动。 该怎么办呢? 这个时候就需要用到方法的重载, 就是父类的方法达不到我们的业务需求, 我们可以做一些自定义的操作。

修改 ActiveSend.java 文件, 加入 isStart 的方法。

重新编译执行单元测试:

这个时候, 因为活动状态是有效, 所以会提示活动开始了。 这样利用这些特性, 不进使代码量减少, 而且还增加了代码的重用性。

并且在子类中可以访问对应的成员变量和方法:

可以看到这里包含的成员变量信息, 以及对应的方法。 但是为什么会出现一些没有在父类和子类都出现的方法呢, 比如: hashCode(), getClass() 等方法, 这个主要因为是不管一个类是否有父类 extends 的显式指定, 所有的类都有一个程序语言默认的父类 Object。

查看 java17 的 API 文档, 模块为 java.base, 包为:java.lang,并找到 Object 对象,接口内容截图如下:

这里就包含了, 我们刚刚看到的方法。

super关键字

针对上面的活动是否开始的方法, 其实还有不同的实现, 这个实现方式可以使用super关键字调用。既然不让校验时间, 就说明时间的判断一直保持真就好了。 所以构建时间为真的代码也可以实现以上的业务需求。

重新修改代码如下:

修改单元测试的代码, 在最后再显示一遍活动信息。

如果子类想调用父类的方法和变量可以直接使用 super 进行调用。实现业务的方式有很多种, 在进行方案的确定的时候, 要多考虑后续怎么能够最小的功夫改动代码实现可能带来的业务增长。 特别是给甲方开发代码的时候, 你要比甲方想的更多才能应对需求的无止境变化。 不仅是一版一版的迭代, 还有可能撤回上一版本的情况。

instanceof

instanceof 主要用来判断某个类是否属于某个类的判断。

继承的知识点还有很多, 上面的例子多联系, 多考虑生活中可以用在继承上的场景, 在一定的思考上要实现具体的代码, 只有写出来代码才能知道你想的能不能很好的使用继承的方式来实现。不要陷入深度思考, 就只有思考的冰窟。

有问题,留言回复吧。关注, 收藏,点赞。

每篇一句:读不在三更五鼓,功只怕一曝十寒。

Tags:

最近发表
标签列表