今天,我们将要讨论的内容是Java里面类的继承的相关概念。

说到继承,我相信大家都不陌生。生活中,子承父业,子女继承父母的财产,这就是继承。实际上,Java里的继承也是如此。对于一个类来说,它的数据成员和方法就是它的财产,而申明另一个类接收了这个类的财产,这就是Java里的继承。

接下来我将就几个方面,谈一谈继承的相关知识。

一、继承的基本格式与意义

在上文,我们了解了什么叫做继承。那么,如何使用继承?

继承的关键词是extends。继承的一般格式为:public class 类名 extends 类名{};

假定有两个类,A、B,在申明B类的时候,我们要求B类继承A类的数据成员与方法。

具体实现如下:

继承有两大意义。一是提高了代码的重用性,二是提高了程序的扩展性。继承能使得我们的代码更加简易,同时也更加灵活。

二、什么时候使用继承

上文我们讲到,继承能提高代码的重用性,提高程序的扩展性。那么,我们不禁要问,什么时候,我们可以使用到继承?

我的理解是,当两个类存在包含关系的时候,我们为了简化程序,可以使用到继承。

举个例子,车是一个类,公交车也是一个类。两个类存在包含关系。那么,在申明公交车这个类的时候,对于一些车共有的数据成员和方法,我们可以让它继承车这个类从而获取这些属性和方法。而对于一些公交车特有的属性和方法,我们可以在公交车类当中进行添加。比如说,定义一个车类,它有三个属性值,长度、宽度、重量。而定义一个公交类,我们需要添加上一个takepeople的方法。

具体实现如下:

三、继承的内容

大家可能会注意到一个细节,那就是上文当中我编写的代码,无论是数据成员还是方法,我给它的访问修饰符都是public。我们知道,在Java里面,访问修饰符总共有四种,那么,子类是否能够继承下来父类所有的属性和方法呢?事实上,子类是可以接收父类所有的属性和方法的,也就是说,无论访问修饰符是public还是private,子类都能够从父类那里接收到。但是,对于私有域,子类是不能够去访问的。而Java中关于继承的定义是获取可以访问的属性和方法,所以,我们说私有量是不被继承的。

四、方法重写

什么叫方法重写?方法的重写就是在一个子类中,重写它继承的父类的方法的过程。重写的前提是,首先要有至少两个存在继承关系的类。其次,子类在重写方法的过程中,方法的访问修饰符必须大于或者等于父类中方法的访问修饰符。重写不能改变方法的方法名、返回值类型、参数,它只能更改方法体内的内容。注意一点,方法重写后不能与原方法相同,否则不能称为重写。

比如,申明一个学生类,一个大学生类,让大学生类继承学生类,重写学习方法,具体代码如下:

这就是方法重写的具体举例。

五、super关键字

接下来,我们来认识一下super关键字。

谈到super,我们可以联系到之前讨论过的this关键字。关于this,我们可以用this.方法(数据成员)这样的方法去调用当前类的属性和方法,也可以用this(参数类型 参数名)这样的方式去调用当前类的构造方法。this是指向当前类的一个类似指针的引用,super与this类似,它指向的是当前类的父类。我们注意到,当你的父类存在参数不为空的构造方法的时候,往往你的子类就会出现报错的情况。这个时候,我们就需要用到super去调用父类的构造方法。继续以上文所举的学生与大学生为例,我们在学生类当中添加一个带参的构造方法。具体代码如下:

六、自动转型与强制转型

有了继承与方法重写,接下来,我们来认识一下自动转型和强制转型。

在这之前,我们先来回想一下类的实例化的过程。实例化类的格式是:类名 对象名=new 构造方法名(参数类型 参数...)。

自动转型的格式有两种,第一种:父类名 对象名=new 子类构造方法(参数类型 参数名...)。

第二种:public void method(父类名  参数名){

              }

              子类名 对象名a = new 子类构造方法(参数值,...);

父类名  对象名b = new 子类构造方法(参数值,...);

              method(对象名a);

              method(对象名b);

我们知道,经过自动转型后,我们将不能调用子类添加的方法和数据成员,那么,我们不禁要问,转型后的对象所调用的方法,究竟是掉的父类的方法还是子类经过重写后的方法呢?我们不妨来做一次测试,代码如下:

让我们再来看一看运行结果:

没错,结果显示,我们调用的是子类重写后的study方法,为什么呢?

我们之前论述过,实例化类的过程。类名 对象名,在栈中开辟一块内存,然后记录下对象名。new 构造方法名(参数类型 参数名...),这是在堆中开辟出一块内存并存储下构造方法所在类的数据成员和方法。=,在两块内存之间建立连接,并且在栈中对象名所在位置添加上数据所在堆的位置。而在自动转型的过程中,因为我们调用的是子类的构造方法,所以,我们获取的是子类的study方法。事实上,子类中新增的属性和方法,同样存在在内存当中,而因为对象是父类对象,所以新增的属性和方法则被隐藏起来无法调用。

认识了自动转型,接下来我们来认识一下强制转型。在翻阅别人的博客过程中,我看到一种举例,非常喜欢,所以,我也将用这个例子向大家解释下强制转型。在我看来,继承一般是存在与具有包含关系的两个及以上的类之间。比如说,动物与狗。狗是动物的子类。什么是自动转型,自动转型就是申明一个动物引用指向狗。简而言之,就是将狗转型成动物。很明显,狗是动物,所以,在转型过程中,不会存在什么问题。但是,强制转型的话,就容易出现一些问题。动物转型成狗,换句话说,是动物就是狗。这很明显是不正确。所以,除非你判定这个动物是狗,你才能使用强制转型,否则,计算机将会报错。举个例子,首先你定义一个狗,然后你通过自动转型将它转型成动物,之后你再通过强制转型将它变回狗,这样的强制转型是允许的。在自动转型中,子类添加的属性和方法被隐藏,在强制转型后,被隐藏的内容得以恢复。除了这种情况,我们还可以采用判断这个动物是不是狗之后再确定是否进行强制转型的方法。这里介绍一个新的关键字,instanceof。我们可以通过它去判断这个动物究竟是不是狗。用法如:animal instanceof dog。

七、接口

最后,我要讲到的是接口的部分相关知识。我们知道,Java不同于C++,Java中只允许继承一个父类。显然,在有的时候,只能继承一个父类是不能够满足我们的需求的。所以,Java引入了另一个概念,接口。继承一个类,我们称为继承。对于接口,我们用实现,实现一个接口。我们知道,类里面有抽象类的说法,在我的理解中,接口是比抽象类更抽象的东西。定义一个接口的格式:

对于接口里面的属性,它必须是一个静态数据,而在接口里定义的方法,一定是一个抽象方法。这就是关于接口的定义。

实现接口的关键字是implements。需要注意的是,当你实现接口后,而你的类又不是一个抽象类的话,那么,你需要重写接口内所有的抽象方法。很好理解,因为你继承了抽象方法,而你又不是一个抽象类,自然就会报错了。

关于类的继承方面的知识,我暂时就讨论这么多,期待大家的指正,欢迎大家一起来探讨。

Java编程里类的继承的更多相关文章

  1. C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]

    面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...

  2. Java编程里的类和对象

    像我们搞计算机这块的,都知道这么一件事,当前的计算机编程语言主要分为两大块,一为面向过程,二为面向对象.Java就是一门纯面向对象的语言.学习了一个月左右的Java,在下对于Java当中的类和对象有了 ...

  3. java中阻止类的继承

    1.使用final来修饰类 final表示这个类是继承树的末端,不能被继承. 2.将类的构造方法声明为private的,再提供一个static的方法来返回一个类的对象. JAVA语言要求继承时必须在构 ...

  4. Java基础 -- 复用类(组合和继承)

    复用类有两种实现方式. 在新的类中产生现有类的对象,由于新的类是由现有类的对象所组成,所以这种方法称之为组合. 采用继承实现. 一  组合语法 下面创建两个类WaterSource和Sprinkler ...

  5. Java编程的逻辑 (16) - 继承的细节

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  6. Java编程的逻辑 (17) - 继承实现的基本原理

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  7. 【代码笔记】Java基础:类的继承(构造器)

    在Java中,创建对象的格式为: 类名 对象名 = new 类名(): 如: 1 JFrame jf = new JFrame(); 一个对象被创建出来时,经常要先做一些事这个对象才能正常使用,也可以 ...

  8. obj-c编程04:类的继承

    这第4篇内容比較少,主要说的是obj-c中的类的继承,须要说明的是我仅仅是写了继承中最简单的形式,假设所有展开来说,那就多了去了!关键是如今肚子里还没装够墨水,没法展开啊! 以下的代码中,我们写了2个 ...

  9. [Java学习]面向对象-类的继承;方法覆盖

    一.类的继承 实现方法: public Class SubClass extends SuperClass{ } 继承最基本作用: 代码重用. 继承最重要的作用: 方法可以重写. 关于类的继承: 子类 ...

随机推荐

  1. 可扩容分布式session方案

    分布式session有以下几种方案: 1. 基于nfs(net filesystem)的session共享 将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器i ...

  2. The currently selected variant "arm-debug" uses split APKs, but none of the 1 split apks are compatible with the current device with density "213" and ABIs "x86".

    出现这种错误一般是在电脑上用模拟器运行APK的吧. 可以在build.gradle中这样配置下: android{ ... defaultConfig { applicationId "XX ...

  3. SVN:服务器资源删掉,本地添加时和删掉的名字同名出现One or more files are in a conflicted state.

    异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html

  4. vue实例属性(vm.$els)

    不需要表达式 参数: id(必需) 用法: 为 DOM 元素注册一个索引,方便通过所属实例的 $els 访问这个元素. 注意: 因为 HTML 不区分大小写,camelCase 名字比如 v-el:s ...

  5. Oracle_SQL函数-分组函数

    分组函数 什么是分组函数 分组函数作用于一组数据,并对一组数据返回一个值 组函数类型:主要有6种 AVG - 平均 COUNT - 计数 MAX - 最大 MIN - 最小 SUM - 求和 STDD ...

  6. 【技巧篇】解决悬浮的<header>、<footer>遮挡内容的处理技巧

    引言   在现在的前端页面中,尤其是移动端,经常会需要将<header>或者是<footer>模块悬浮出来,跟随页面的滑动保持定位在页面的最上方或者是最下方,如下图所示. “回 ...

  7. Js权限判断处理

    主要实现自动处理视频点击判断权限. function lookVideo() { var review_con = document.getElementById("review" ...

  8. jquery实现的网页选项卡(拾忆)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. LTP随笔——本地调用ltp之ltp4j

    关于ltp本地调用的相关参考请见LTP的Git项目:https://github.com/HIT-SCIR 以下以/home/lion/Desktop路径为例下面教程中出现的具体路径以你实际配置的为准 ...

  10. EntityFramework 如何进行异步化(关键词:async·await·SaveChangesAsync·ToListAsync)

    应用程序为什么要异步化?关于这个原因就不多说了,至于现有项目中代码异步化改进,可以参考:实际案例:在现有代码中通过async/await实现并行 这篇博文内容针对的是,EntityFramework ...