从零开始学Java(十五)Java继承定义及使用

上篇说到Java-static关键字(下) 今天我们开始学习有关Java继承的知识。

本篇文章主要内容:

Java继承定义

继承是面向对象三大特征之一,封装居首位,封装之后形成了独立体,独立体A和独立体B之间可能存在继承关系。其实程序中的继承灵感来自于现实生活,在现实生活中继承处处可见,例如,儿子继承了父亲的财产,儿子不需要努力就很有钱

生活中的继承:

图1:现实世界中的继承

继承时子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性,或子类从父类继承方法,使得子类具有与父类相同的行为。兔子和羊属于食草动物类,狮子和豹属于食肉动物类。食草动物和食肉动物又是属于动物类。所以继承需要符合的关系是:is-a(Bird is-a Animal),父类更通用,子类更具体。虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。

为什么要使用继承机制?在不同的类中也可能会有共同的特征和动作,可以把这些共同的特征和动作放在一个类中,让其它类共享。因此可以定义一个通用类,然后将其扩展为其它多个特定类,这些特定类继承通用类中的特征和动作。继承是 Java 中实现软件重用的重要手段,避免重复,易于维护。

Java如何继承

java中继承的语法格式:

class 类名 extends 父类名{

类体;

}

为什么需要继承,接下来我们用以下这个需求来说明一下:

public class Account { //银行账户类//账号private String actno;//余额private double balance;//账号和余额的set和get方法public String getActno() {return actno;}public void setActno(String actno) {this.actno = actno;}public double getBalance() {return balance;}public void setBalance(double balance) {this.balance = balance;}}
public class CreditAccount { //信用账户类//账号private String actno;//余额private double balance;//账号和余额的set和get方法public String getActno() {return actno;}public void setActno(String actno) {this.actno = actno;}public double getBalance() {return balance;}public void setBalance(double balance) {this.balance = balance;}//信誉度(特有属性)private double credit;//信誉度的set和get方法public double getCredit() {return credit;}public void setCredit(double credit) {this.credit = credit;}}

以上两个类分别描述了“银行账户类”和“信用账户类”,信用账户类除了具有银行账户类的特征之外还有自己的特性,按照以上代码的编写方式,程序将会非常的臃肿,我们将上面的程序修改为继承方式,请看代码:

public class Account { //银行账户类//账号private String actno;//余额private double balance;//账号和余额的set和get方法public String getActno() {return actno;}public void setActno(String actno) {this.actno = actno;}public double getBalance() {return balance;}public void setBalance(double balance) {this.balance = balance;}}
public class CreditAccount extends Account{ //信用账户类//信誉度(特有属性)private double credit;//信誉度的set和get方法public double getCredit() {return credit;}public void setCredit(double credit) {this.credit = credit;}}
public class AccountTest {public static void main(String[] args) {CreditAccount act = new CreditAccount();act.setActno("111111111");act.setBalance(9000.0);System.out.println(act.getActno() + "信用账户,余额" + act.getBalance() + "元");}}

运行结果如下图所示:

图2:继承测试

通过以上的代码,我们可以看到继承是可以解决代码臃肿问题的,换句话说,继承解决了代码复用的问题,但这其实并不是继承最重要的作用,继承最重要的作用是:有了继承才有了方法覆盖和多态(后续的课程中详细讲解)

继承有哪些特性呢?以下内容需要记忆:

● B类继承A类,则称A类为超类(superclass)、父类、基类,B类则称为子类(subclass)、派生类、扩展类。

● java中的继承只支持单继承,不支持多继承,C++中支持多继承,这也是java体现简单性的一点,换句话说,java中不允许这样写代码:class B extends A,C{ }。

● 虽然java中不支持多继承,但有的时候会产生间接继承的效果,例如:class C extends B,class B extends A,也就是说,C直接继承B,其实C还间接继承A。

● java中规定,子类继承父类,除构造方法和被private修饰的数据不能继承外,剩下都可以继承。

● java中的类没有显示的继承任何类,则默认继承Object类,Object类是java语言提供的根类(老祖宗类),也就是说,一个对象与生俱来就有Object类型中所有的特征。

● 继承也存在一些缺点,例如:CreditAccount类继承Account类会导致它们之间的耦合度非常高,Account类发生改变之后会马上影响到CreditAccount类。

接下来我们来测试一下从Object类中继承过来的方法,先来看一下Object类的部分源代码:

图3:Object类中toString()方法源代码

我们来尝试调用这个方法,请看代码以及执行结果:

public class ExtendsTest{public static void main(String[] args) {ExtendsTest et = new ExtendsTest();String s = et.toString();System.out.println(s);}}

运行结果如下图所示:

图4:toString()方法执行结果

虽然输出结果看不懂,但是起码看到这个字符串当中确实是有一个“@”符号的,toString()方法确实被ExtendsTest类继承过来了。

(0)

相关推荐

  • 第5章 子类与继承

    主要内容  子类与父类  子类的继承性  子类与对象  成员变量的隐藏和方法重写 重点与难点:  重点:重点是类的继承性.方法重写.  难点:难点是理解子类继承过程中成员变量的隐藏与方法重 ...

  • 从零开始学八字(五十四):建禄格举例

    同人易学交流今天讲建禄格的例子.壬壬甲庚辰寅寅午格局分析:甲生寅月,建禄格.寅辰夹卯阳刃,时辰带庚七杀不喜.时支午火大用,寅午伤官半合火局,可以制杀,化刃.不喜年月壬水偏印,毕竟影响伤官发用.且伤官太 ...

  • 从零开始学投资(五)——如何构建基金组合

    分散原则 在之前的几节课程里,我基本给大家科普了价值投资的原理.估值手段以及基本的基金挑选思路. 在这之后,我们就可以开始着手构建一个基金组合. 首先,大家要知道咱们构建组合的目的,在于分散我们的投资 ...

  • 从零开始学八字(五):干支知识中篇

    上篇,把干支的概念.阴阳五行属性.代表方位.时间.生肖以及纳甲等知识,简单梳理了一遍,这样大家对干支基础知识有了一个比较基本的了解和认知(从零开始学八字(四):干支知识上篇).但是,如果真的想深入学习 ...

  • 怪想之圆周率学历史十五 1399(大明朱棣)

    有时候开心很简单,放下手中事情,出去走走 感慨人生的辛酸苦辣,欣赏路上的风景 苦恼是一生,放松也是一生,一生不过百年 可以稍微放松些,不要太累. 人生无涯 成功也好,失败也罢,人都要在这短短的十几年留 ...

  • 普洱茶从零开始教程第十五课

    这是一个,还有一个,我一提大家都知道名字叫无量山,无量山这个地方现在全部种的都是等会我下面要讲的云抗10号,云抗10号大家千万别理解成为台地茶,我们所说的台地茶是灌木,但是在这个地方我要纠正一下,所谓 ...

  • 从零开始学唱歌的五个步骤

    从零开始学唱歌的五个步骤

  • 从零开始学伤寒(五)

    言行如一,从对自己诚实开始. 这是源寶每天原创更文第一年第271篇. 提到伤寒论,就不得不提一个名词,叫六经辩证,整个伤寒论就是以六经辩证的. 先说什么是辩证,就是医者尽其所能用什么办法也行,对病人表 ...

  • 朱茵版射雕24,郭靖连学降龙十五掌,黄蓉苦练逍遥游

    这一日七公忽然心有所感道:半年了,没想到和你们这两个小朋友住了这么长时间.靖儿已经跟我学了大半的掌法,若再教下去等到学全后岂不成了我入室弟子,我堂堂北丐怎会收这等笨拙的徒弟.今日我们就此别过,记住我们 ...

  • 从零开始学Java(十)Java面向对象

    面向对象 1.面向过程和面向对象有什么区别? 从语言方面出发: 对于C语言来说,是完全面向过程的. 对于C++语言来说,是一半面向过程,一半是面向对象.(C++是半面向对象的) 对于Java语言来说, ...