0 前言

初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类、对象、重载、封装、继承、多态、覆盖、抽象类、接口概念。为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定义、设计用意、使用规范和注意事项。

长文警告,建议先收藏后阅读!

为控制篇幅,本文将分上中下三篇讲解以上概念。

  • 上篇:讲解类、对象、构造器、重载和封装概念。

自动驾驶小白:【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(上篇)​zhuanlan.zhihu.com

  • 中篇:讲解继承、覆盖和多态概念。

自动驾驶小白:【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)​zhuanlan.zhihu.com

  • 下篇:讲解抽象和接口概念,以及一个综合练习。

自动驾驶小白:【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(下篇)​zhuanlan.zhihu.com


1 继承(Inheritance)

1.1 案例

咱们稍微加一点难度。
现在要求设计一个面积计算器,计算的对象不仅仅是矩形,还包括平行四边形。输入仍然为高和宽(假定都是规范的数值输入),输出为面积。

1.2 代码

为了简化代码,前面已经实现过的内容(比如封装)就不再展开写了。

class 

1.3 代码分析

思考:以上代码写起来挺简单,但是有个问题,就是代码重复率太高!这才两个类,要是有成百上千个这种类,不仅写得累,后期维护也累。

有没有什么偷懒的办法呢?当然有啦,就是后面要介绍的继承。

1.4 改进版代码

class 

1.5 改进版代码分析

诶?咋一看,好像并没有省事哦?
那是因为我们这里只有两个子类,如果换成实现成百上千个这种子类,差距就会拉开了。咱们来分析一下这是如何实现的。

以上代码包含以下概念:继承(Inheritance):即基于已有的类(称之为父类或超类)来创建新的类(称之为子类),顾名思义,子类将继承父类所有的成员变量及方法。继承一般应用于类与类较相似的情况下,比如本案例中,矩形类与平行四边形类的成员变量和方法高度相似,可以提取两者的共同代码,构造一个四边形类作为父类,从而避免了重复代码,也方便了后期功能的扩展及维护。

注意:

  • JAVA中类只能单继承(即只能继承一个父类),但不仅限于一个层次,Object是所有类的终极父类,是万物之源。
  • 子类继承父类时需要用到关键字“extends”。
  • 子类能继承父类所有的成员变量和方法(除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。
  • 若父类定义了构造函数,子类需要用super调用父类的构造方法,且必须位于子类构造方法中的第一行。
  • 子类继承了父类,不代表只能用父类的东西,还可以定义自己的成员变量及方法,甚至于可以改写父类的方法(即后文讲到的覆盖)。

2 覆盖(Override)和多态(Polymorphism)

2.1 案例

咱们稍微再加一点难度。
现在要求设计一个面积计算器,计算的对象不仅仅是矩形和平行四边形,还包括梯形。矩形和平行四边形的输入为高和宽,梯形的输入为高、上底长和下底长(假定都是规范的数值输入),输出都为面积。规定:矩形和平行四边形的面积计算公式为宽x高;梯形的面积计算公式为(上底+下底)x 高/2

2.2 代码

思考:我们仍然可以采用继承来实现,但是梯形的面积计算方法与矩形和平行四边形不同,如何以最简洁的方法实现代码?

具体代码如下:

class 

2.3 代码分析

以上代码用到了以下概念:覆盖(Override):指在继承中,父类的有些方法在子类中不适用,子类重新定义的手段。在本案例中,梯形类对calcuArea方法实现了覆盖。

注意:

  • 若子类中被“覆盖”方法的参数类型不同,返回类型不一致,这不是覆盖,而是重载。覆盖要求参数类型必须一样,且返回类型必须兼容。总之,子类对象得保证能够执行父类的一切。
  • 不能降低覆盖方法的存取权限,如public变成private。
  • 若不希望父类的某个方法被子类覆盖,可以用final修饰该方法。甚至可以扩展到将类用final修饰,则其中所有的方法均不可覆盖,但不影响成员变量的赋值。

思考:Test类中的语句块有点啰嗦,同样是初始化加调用面积计算方法,三个对象实现了三次,那如果有成百上千个类岂不是要累死,这能否优化呢?

2.4 改进版代码

对Test类进行优化可以得到如下代码:

public 

2.5 改进版代码分析

以上代码用到了以下概念:多态(Polymorphism):指一个对象变量(如代码中的qua)可以指示多种实际类型的现象。由于矩形类、平行四边形类和梯形类都是继承于四边形父类,所以其方法名一致,可以通过一个父类的对象变量来实现子类的自动匹配,从而简化了代码。

多态的优缺点

  • 优点:可以提高可维护性(多态前提所保证的),提高代码的可扩展性
  • 缺点:无法直接访问子类特有的成员。

思考:这个缺点怎么解决呢?比如在上述代码中,无法通过qua.width_up获取只有梯形的才有的成员变量。解决方法:可以通过instanceof判断对象变量的实际类型以及对象类型转换实现相应的操作,代码如下:

public 


3 参考文献

[1]《Head First Java(第二版·中文版)》

[2]《Java核心技术·卷 I(原书第11版)》

[3] 菜鸟教程:https://www.runoob.com/java/j...

[4] 速学堂:https://www.sxt.cn/Java_jQuer...

java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...相关推荐

  1. Python+花生壳搭建一个外网访问本地文件的服务器

    1.首先电脑要安装python并且配置环境变量 (安装Python时勾选 Add Python to PATH,可以自动配置环境变量) 官网:Python.org 2.安装完成后,按下 [win+R  ...

  2. tomcat 外网访问不了_免费云服务器/jdk环境配置/Tomcat简单配置

    关于本文:     最近准备做一期jdk环境配置教程,准备做一个实机演示,于是想到用云服务器来为大家演示,顺路写上如何申领一个月免费服务器,以及如何让外网访问自己的云服务器,这这里我依旧使用Tomca ...

  3. java写一个外网访问的接口_不是吧不是吧!随便写的一个API竟获得 2.5 亿的访问量...

    简评:作者随手在 Stackoverflow 回答了一个问题,几个月之后,竟发现这个回答带来了 2.5 亿次的 API 访问.作者还因此成立了公司专门运作这个 API. 以下我仅代表原作者. 推广很难 ...

  4. java写一个外网访问的接口_Java程序员如何入门?教你写第一个程序

    大家都知道,Java是一门面向对象的编程语言,不仅吸收了C++的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大.简单易用. 另外,Java允许程序员以优雅的思维方 ...

  5. 必须有公网IP吗?内网穿透如何实现外网访问

    很多中小型公司或个人都有将自己内网的服务.应用,如远程桌面.网站.数据库.公司的管理系统.FTP.管家婆.监控系统等等,发布到外网,实现异地访问的需求.但往往面临一个普遍的问题,就是没有公网IP,即没 ...

  6. 外网访问群晖NAS VMM搭建Openwrt的admin界面

    偶然在网上看到很多的帖子使用群晖搭建openwrt搭建旁路由,心血来潮体验了一把,记录一下自己的搭建的整个过程,并最终实现外网访问Openwrt的admin界面. 本人使用的群晖nas DS220+, ...

  7. 远程终端服务(3389)的安全配置方法,无需公网IP,3步实现外网访问远程桌面

    无论是什么类型的远程连接,都需要端口才能实现,所谓的端口,就像是远程连接的大门一样. 我们平常使用的windows操作系统的远程桌面服务端口就是3389,3389远程桌面协议是一个多通道(multi- ...

  8. 用自己的电脑做网站服务器,实现外网访问

    原文地址::用自己的电脑做网站服务器,实现外网访问 - 云+社区 - 腾讯云 相关文章 1.开发者赋能计划-百度智能云 2.腾讯云618采购季_腾讯云618特惠_腾讯云618活动-腾讯云 3.共建智能 ...

  9. ADSL宽带路由器实现外网访问公司内网服务器_ 路由交换

    A公司通过ADSL访问互联网,并且内网通过ADSL宽带路由器共享一条ADSL线缆访问互联网. 随着A公司业务的发展,公司需要搭建一台Web服务器供外网访问.Web服务器主要包括一个公司网站,并且负责日 ...

最新文章

  1. Linux从程序到进程
  2. 中tr不能显示字符_BeautifulSoup4中find 和find_all的比较
  3. 阿里全资收购一家核心技术公司,中科院大牛带队加盟
  4. Hive数据分析——Spark是一种基于rdd(弹性数据集)的内存分布式并行处理框架,比于Hadoop将大量的中间结果写入HDFS,Spark避免了中间结果的持久化...
  5. 获取GridView隐藏列值
  6. ssm学习的第一个demo---crm(2)
  7. Bootstrap框架系列 - 初识
  8. 基于CLGeocoder - 地理编码
  9. 欢乐纪中A组赛【2019.8.9】
  10. 【图论】【启发式搜索】【二分查找】[POJ 3897]Maze Stretching
  11. python调用win32_python调用win32接口进行截图
  12. Java中对Array数组的api展示
  13. 免费学python的网课-这些 AI 课网课最具人气!不仅免费、系统,还附带链接 | 资源...
  14. Pubmedy加载时显示程序包无效的解决方案
  15. 图解通信原理与案例分析-12:无线调幅广播AM案例--模拟幅度调制与点对多点广播通信详解
  16. 【线性分类器】(二)“深度学习”的鼻祖——感知器
  17. ToF 3D视觉传感技术详解、应用场景和市场前景
  18. 科学大家谈 | 全球著名蛋白质工程学家——张阳
  19. 汉字编码问题(附编码察看器)
  20. 2020-04-13

热门文章

  1. java和C中基本数据类型的所占字节数对比
  2. php 制表符分隔csv,CSV(逗号分隔)、文本文件(制表符分隔) 等文件的读取
  3. c++后台管理系统_【获奖案例】第三届全国医院物联网大会“中国医院物联网应用十大优秀案例”安徽医科大学第一附属医院手术室行为管理系统...
  4. 这样的阅读工具,人手一个不过分吧?
  5. 墙裂推荐!卡神力作《代码随想录》,上架首日卖爆!
  6. 用Spring Boot复刻一款天猫商城,你可以做到!
  7. 每日一皮:我们最要避开的山寨产品...
  8. 大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?
  9. 成为阿里 P7 真的难么?
  10. Dubbo 稳定性案例:Nacos 注册中心可用性问题复盘