前面介绍了类的基本用法,主要是如何封装一个类的各项要素,包括成员属性、成员方法、构造方法等,想必大家对类的简单运用早已驾轻就熟。所谓“物以类聚,人以群分”,之所以某些事物会聚在一起,乃是因为它们拥有类似的品性。那么面向对象的目的,就是将一群事物之间共同的行为特征提炼出来,从而归纳为具有普适性的类型。像日常生活中说的昆虫、鱼类、鸟类,便是人们把外表相似、习性相近的一系列动物归类的结果。
以鸟类为例,按照科学家的定义,它们是动物界→脊索动物门→鸟纲下面所有动物的总称。倘若按照大众的观点,鸟类为长着一对翅膀和两条腿的有羽动物的统称,特别是羽毛把鸟类与各种昆虫以及蝙蝠区别开来。假设现在有一群鸟类,需要通过几项特征将它们区分开,则可提问几个为什么,诸如它的名称是什么、它的叫声是什么、它的性别是什么等等。这些用来区别鸟儿个体的特征,对应于面向对象理论的属性概念,那么在Java编程之中,可以设计一个名叫Bird的鸟类,并给Bird类定义名称、叫声、性别等成员属性,以及读写属性的成员方法,如此便构成了程序世界里面的鸟类定义。
至于Bird类的具体定义,相信大家参照之前的类封装,即可轻车熟路填写其中的成员属性、成员方法,乃至构造方法等要素。下面是一个Bird类的详细定义代码例子:

public class Bird {
// 定义鸟的名称
private String name;
// 定义鸟的叫声
private String voice;
// 定义鸟的性别类型。0表示雄性,1表示雌性
private int sexType;
// 定义鸟的性别名称
private String sexName; // 鸟类的构造方法(无任何输入参数)
public Bird() {
this.name = "鸟";
} // 鸟类的构造方法(输入参数包含:名称、性别、叫声)
public Bird(String name, int sexType, String voice) {
this.name = name;
this.voice = voice;
setSexType(sexType); // 该方法内部同时修改性别类型和性别名称
} // 设置鸟的名称
public void setName(String name) {
this.name = name;
} // 获取鸟的名称
public String getName() {
return this.name;
} // 设置鸟的叫声
public void setVoice(String voice) {
this.voice = voice;
} // 获取鸟的叫声
public String getVoice() {
return this.voice;
} // 设置鸟的性别类型,并自动调整性别名称
public void setSexType(int sexType) {
this.sexType = sexType;
this.sexName = (sexType==0) ? "雄" : "雌";
} // 获取鸟的性别类型
public int getSexType() {
return this.sexType;
} // 获取鸟的性别名称
public String getSexName() {
return this.sexName;
} // 输出鸟类的基本信息描述文字
public String toString() {
String desc = String.format("这是一只%s%s,它会%3$s、%3$s地叫。",
this.sexName, this.name, this.voice);
return desc;
}
}

有了上面的鸟类定义,然后外部才能按部就班地使用Bird类,譬如通过Bird声明一只鸽子的实例,则相关的调用代码如下所示:

		// 创建一个鸟类的实例
Bird pigeon = new Bird();
pigeon.setName("鸽子");
pigeon.setSexType(1);
pigeon.setVoice("咕咕");
System.out.println(pigeon.toString());

运行以上的代码例子,可观察到以下的日志输出结果:

这是一只雌鸽子,它会咕咕、咕咕地叫。

可是鸽子并非单独的一种鸟类,而是鸟纲→鸽形目→鸠鸽科→鸽属下面所有鸽类的统称,包括家鸽、岩鸽、银鸽、雪鸽、斑鸽、黄腿鸽、白头鸽等等,这些鸽类动物相互之间具备更接近的习性特征,理应拥有自己的类定义如Pigeon类。
考虑到所有的鸟类动物都存在大类之下再分小类的需求,小类在大类的基础上再体现本类的特色属性,故而定义小类之时不必另起炉灶,完全可以基于大类然后修修补补形成新的小类定义。这种小类基于大类的关系,在面向对象体系中被称作“继承”,意思是小类继承了大类的所有成员,大类更专业的称呼叫“基类”,基于大类的小类也被起了个大名叫做“派生类”。
现在就以前述的Bird为基类,给它扩展出一个新的派生类Swallow(燕子类),准备把鸟纲→雀形目→燕科下面的家燕、雨燕、金丝燕等包罗在内。Java代码中表示继承关系的关键字是extends,从A类派生出B类的写法为“class B extends A”,其余的类定义框架保持不变。于是从Bird派生而来的Swallow类定义代码示例如下:

//定义了一个继承自鸟类的燕子类
public class Swallow extends Bird {
// 燕子类未重写任何构造方法,则默认使用不带输入参数的构造方法
}

仅仅看Swallow类的代码定义,发现内部空空如也,其实它早已继承了Bird类的所有成员属性和成员方法,以及默认的构造方法。外部使用Swallow类的时候,就像操作Bird类一样的用法,比如下面代码演示了如何创建燕子类的实例、以及如何调用该实例的方法:

		// Swallow类使用不带任何参数的默认构造方法
Swallow swallow = new Swallow();
swallow.setName("燕子");
swallow.setSexType(0);
swallow.setVoice("啾啾");
System.out.println(swallow.toString());

运行上面的演示代码,可以看到下述的日志信息:

这是一只雄燕子,它会啾啾、啾啾地叫。

由此可见Swallow类的确完整继承了Bird类的所有成员。

更多Java技术文章参见《Java开发笔记(序)章节目录

Java开发笔记(四十八)类的简单继承的更多相关文章

  1. Java开发笔记(十八)上下求索的while循环

    循环是流程控制的又一重要结构,“白天-黑夜-白天-黑夜”属于时间上的循环,古人“年复一年.日复一日”的“日出而作.日落而息”便是每天周而复始的生活.计算机程序处理循环结构时,给定一段每次都要执行的代码 ...

  2. Java开发笔记(九十八)利用Callable启动线程

    前面介绍了如何利用Runnable接口构建线程任务,该方式确实方便了线程代码的复用与共享,然而Runnable不像公共方法那样有返回值,也就无法将线程代码的处理结果传给外部,造成外部既不知晓该线程是否 ...

  3. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  4. Java开发学习(二十八)----拦截器(Interceptor)详细解析

    一.拦截器概念 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如 ...

  5. Java开发笔记(十四)几种运算符的优先级顺序

    到目前为止,我们已经学习了Java语言的好几种运算符,包括算术运算符.赋值运算符.逻辑运算符.关系运算符等基础运算符,并且在书写赋值语句时都没添加圆括号,显然是默认了先完成算术.逻辑.关系等运算,最后 ...

  6. Java学习笔记(十八)——Java DTO

    [前面的话] 在和技术人员的交流中,各种专业术语会出现,每次都是默默的记录下出现的术语,然后再去网上查看是什么意思.最近做项目,需要使用到DTO,然后学习一下吧. 这篇文章是关于Java DTO的,选 ...

  7. 【Java学习笔记之十八】Javadoc注释的用法

    Javadoc注释的用法 Java 文档 // 注释一行/* ...... */ 注释若干行/** ...... */ 注释若干行,并写入 javadoc 文档 通常这种注释的多行写法如下: /*** ...

  8. 安卓开发笔记(十八):实现button按钮事件的三种方法

    Android开发中有三种主要的方式用于设置View的点击事件,1.创建内部类:2.主类中实现OnClickListener接口:3.使用匿名内部类.这三种方式都用到了OnClickListener接 ...

  9. Java开发笔记(十九)规律变化的for循环

    前面介绍while循环时,有个名叫year的整型变量频繁出现,并且它是控制循环进出的关键要素.不管哪一种while写法,都存在三处与year有关的操作,分别是“year = 0”.“year<l ...

  10. Java基础笔记(十八)——多态

    多态表示同一个操作作用在不同对象时,会有不同的结果. 多态可分为编译时多态和运行时多态. 编译时多态:方法重载,编译时就可以确定到底调用哪个方法,可以被看做一个类中的方法多态性. 运行时多态:只有在运 ...

随机推荐

  1. python错误和异常

    一:语法错误syntax errors        熟悉语法! 二:异常 ①打印错误信息时,异常的类型作为异常的内置名显示,并以调用栈的形式显示具体信息    ②常见的异常:             ...

  2. LoadRunner(一)——性能测试基础及性能指标概述

    参考学习感谢:<精通软件性能测试与LoadRunner实战> 一.典型的性能测试场景 某个产品要发布了,需要对全市的用户做集中培训.通常在进行培训的时候,老师讲解完成一个业务以后,被培训用 ...

  3. 【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动

    第6章        示波器设计—双通道ADC驱动 本章节为大家讲解示波器的ADC驱动,采用STM32自带ADC实现.关于STM32F429的ADC,可以说处处有地雷,不小心就踩上了,如果简单的使用, ...

  4. netsh winsock reset命令

    公司一台电脑无法浏览网页,其他基本正常,鼓捣了一个多小时,依然无法解决.. 一开始按照正常思路,感觉是dns的问题,查看了下DNS,真是自定义的,于是改成自动获取,无效 重启了网卡,无效 重启电脑,无 ...

  5. SUSE12Sp3-Supervisor 守护.net core进程

    1.安装setuptools 将setuptools-0.6c11.tar.gz安装包放到服务器上 tar zxvf setuptools-0.6c11.tar.gz cd setuptools-0. ...

  6. [Swift]LeetCode717. 1比特与2比特字符 | 1-bit and 2-bit Characters

    We have two special characters. The first character can be represented by one bit 0. The second char ...

  7. [Swift]LeetCode884. 两句话中的不常见单词 | Uncommon Words from Two Sentences

    We are given two sentences A and B.  (A sentence is a string of space separated words.  Each word co ...

  8. javascript之reduce()方法的使用

    以前看到reduce方法,总是看得我头皮发麻,今天无意间又遇到他了,于是学习了下,接触之后,觉得这个方法还挺好用的,在很多地方都可以派上用场,比如,数组中元素求和.数组去重.求数组中的最大值或最小值等 ...

  9. PyCharm2019 激活码

    因公司的需求,需要做一个爬取最近上映的电影.列车号.航班号.机场.车站等信息,所以需要我做一个爬虫项目,当然java也可以做爬虫,但是还是没有python这样方便,所以也开始学习Python啦!!! ...

  10. 低延时的P2P HLS直播技术实践

    本文根据4月21日OSC源创会·武汉站的现场分享为蓝本,重新整理.以下是演讲内容: 近几年,随着直播.短视频等视频领域对带宽要求的提升以及CDN行业竞争的加剧,很多CDN公司开始往P2P-CDN方向发 ...