网站首页 > java教程 正文
在《Think in Java》中有这样一句话:复用代码是 Java 众多引人注目的功能之一。但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情。在这句话中最引人注目的是“复用代码”,尽可能的复用代码使我们程序员一直在追求的,现在我来介绍一种复用代码的方式,也是 Java 三大特性 之一—继承。
什么是继承
在讲解之前我们先看一个例子,该例子是前篇博文( 重学JAVA---三大特性之封装)的。
从这里我们可以看出, Wife、Husband 两个类除了各自的 husband、wife 外其余部分全部相同,作为一个想最大限度实现复用代码的我们是不能够忍受这样的重复代码,如果再来一个小三、小四、小五……(扯远了大笑)我们是不是也要这样写呢?那么我们如何来实现这些类的可复用呢?利用继承!!
首先我们先离开软件编程的世界,从常识中我们知道丈夫、妻子、小三、小四…,他们都是人,而且都有一些共性,有名字、年龄、性别、头等等,而且他们都能够吃东西、走路、说话等等共同的行为,所以从这里我们可以 发现他们都拥有人的属性和行为,同时也是从人那里继承来的这些属性和行为的。
从上面我们就可以基本了解了继承的概念了,继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。 通过使用继承我们能够非常方 便地复用以前的代码,能够大大的提高开发的效率。
对于 Wife、Husband 使用继承后,除了代码量的减少我们还能够非常明显的看到他们的关系。
继承所描述的是“is-a”的关系,如果有两个对象A和B,若可以描述为“A是B(丈夫是人)”,则可以表示 A 继承 B,其中 B 是被继承者称之为父类或者超类,A 是继承者称之为子类或者派生类。
实际上继承者是被继承者的特殊化,它除了拥有被继承者的特性外,还拥有自己独有得特性。例如猫有抓老 鼠、爬树等其他动物没有的特性。同时在继承关系中,继承者完全可以替换被继承者,反之则不可以,例如我们可以说猫是动物,但不能说动物是猫就是这个道理,其实对于这个我们将其称之为“向上转型”,下面介绍。
诚然,继承定义了类如何相互关联,共享特性。对于若干个相同或者相识的类,我们可以抽象出他们共有的行为 或者属相并将其定义成一个父类或者超类,然后用这些类继承该父类,他们不仅可以拥有父类的属性、方法还可以定义自己独有的属性或者方法。
同时在使用继承时需要记住三句话:
- 子类拥有父类非 private 的属性和方法。
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
综上所述,使用继承确实有许多的优点,除了将所有子类的共同属性放入父类,实现代码共享,避免重复外,还可以使得修改扩展继承而来的实现比较简单。
构造器
通过前面我们知道子类可以继承父类的属性和方法,除了那些 private修饰之外的还有一样是子类继承不了的—构造器。对于构造器而言,它只能够被调用,而不能被继承。 调用父类的构造方法我们使用 super() 即可。
对于子类而已,其构造器的正确初始化是非常重要的,而且当且仅当只有一个方法可以保证这点:在构造器中调用父类构造器来完成初始化,而父类构造器具有执行父类初始化所需要的所有知识和能力。
所以综上所述:对于继承而已,子类会默认调用父类的构造器,但是如果没有默认的父类构造器,子类必须要显 示的指定父类的构造器,而且必须是在子类构造器中做的第一件事(第一行代码)。
protected 关键字
private 访问修饰符,对于封装而言,是最好的选择,但这个只是基于理想的世界,有时候我们需要这样的需求:我们需要将某些事物尽可能地对这个世界隐藏,但是仍然允许子类的成员来访问它们。这个时候就需要使用到protected。
对于 protected 而言,它指明就类用户而言,他是 private,但是对于任何继承与此类的子类而言或者其他任何 位于同一个包的类而言,他却是可以访问的。
从上面示例可以看书子类 Husband 可以明显地调用父类 Person 的 setName()。
诚然尽管可以使用 protected 访问修饰符来限制父类属性和方法的访问权限,但是最好的方式还是将属性保持为 private (我们应当一致保留更改底层实现),通过 protected 方法来控制类的继承者的访问权限。
向上转型
在上面的继承中我们谈到继承是 is-a 的相互关系,猫继承与动物,所以我们可以说猫是动物,或者说猫是动物的 一种。这样将猫看做动物就是向上转型。如下:
在这我们通过 Person.display(husband)。这句话可以看出 husband 是 person 类型。
将子类转换成父类,在继承关系上面是向上移动的,所以一般称之为向上转型。由于向上转型是从一个叫专用类 型向较通用类型转换,所以它总是安全的,唯一发生变化的可能就是属性和方法的丢失。这就是为什么编译器 在“未曾明确表示转型”活“未曾指定特殊标记”的情况下,仍然允许向上转型的原因。
谨慎继承
上面讲了继承所带来的诸多好处,那我们是不是就可以大肆地使用继承呢?
送你一句话:慎用继承。
首先我们需要明确,继承存在如下缺陷:
- 父类变,子类就必须变。
- 继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的。
- 继承是一种强耦合关系。
所以说当我们使用继承的时候,我们需要确信使用继承确实是有效可行的办法。那么到底要不要使用继承呢?《Think in Java》中提供了解决办法:问一问自己是否需要从子类向父类进行向上转型。如果必须向上转型,则继承是必要的,但是如果不需要,则应当好好考虑自己是否需要继承。
慎用继承!!!!!!!!!!!!!!!!!!!!!!!!!!!
猜你喜欢
- 2024-09-27 Java面向对象的三大特性之——多态
- 2024-09-27 Java语言的特点有哪些?你对Java认知有多少?
- 2024-09-27 大厂面试系列-详解Java面向对象的三大基本特征
- 2024-09-27 Java的这五大特点你都不知道,还敢说自己是程序猿?
- 2024-09-27 Java入门学习:快速了解Java语言的11个特点
- 2024-09-27 细说JAVA的特点,快速带你走近Java的世界
- 2024-09-27 理解Java的三大特性之封装(java封装的定义)
- 2024-09-27 Java语言的11大特性-你知道吗?(java语言的11大特性-你知道吗?怎么回答)
- 2024-09-27 嗨,你知道吗,Spring还有这些高级特性
- 2024-09-27 java不可不知系列——java的11个特点,为什么要选择java?
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)