`
liuwei1981
  • 浏览: 770130 次
  • 性别: Icon_minigender_1
  • 来自: 太原
博客专栏
F8258633-f7e0-30b8-bd3a-a0836a5f4de5
Java编程Step-by...
浏览量:160699
社区版块
存档分类
最新评论

61.方法的覆盖

 
阅读更多

在Java编程语言中,有两个概念非常相近,很容易混淆。它们就是重写与重载。

 

这里先在类继承的话题上,继续来说说重写,也叫覆盖。

 

没有继承,就不可能有重写。这是子类对父类的一种特殊操作。这里先提一下,重载主要发生在同一个类中的操作,也可以发生在父类与子类之间。

 

当一个子类继承了一个父类时,它也同时继承了父类的属性和方法。我们可以直接使用父类的属性和方法,或者,如果父类的方法不能满足子类的需求,则可以在子类中对父类的方法进行“改造”,这个“改造”的过程在Java中称为“覆盖(override)”。


比如,假设我们在Person 类中定义了一个方法用于显示姓名,如下:
public String showName(){
 return name;
}


那么,在子类Teacher中,就会继承这个父类的showName()方法,此时,即使Teacher类中没有定义showName()方法,也可以在它的实例(instance)中使用这个方法。

 

比如,我们实例化了一个Teacher的实例,这是就可以直接调用从Teacher的父类Person中继承的这个showName()方法。如下:
Teacher teacher = new Teacher();
teacher.showName();


但是,我们在Teacher类中,我们或许需要在姓名后面加上“老师”,比如,“张三”就显示为“张三老师”,那么,这个时候就需要在子类“Teacher”中对从父类中继承的showName()方法进行“改造”,也就是在子类Teacher中覆盖父类Person的方法showName():
public class Teacher extends Person{
 … …
 public String showName(){
  return name+”老师”;
 }
}


在子类Teacher中,覆盖了父类的showName方法,在覆盖的过程中,需要提供和父类中的被覆盖方法相同的方法名称、输入参数(此处为空)以及返回类型。


另外,在子类对父类的方法进行覆盖的过程中,不能使用比父类中的被覆盖方法更严格的访问权限。

 

比如,父类Person中的方法showName()的修饰符是public,那么,在子类Teacher中的覆盖方法showName()就不能用protected、默认(Default)或者private等来限制。


从前面的讨论可以看出,类的继承主要可以从两方面来看:


对父类的扩充。如,在子类中加入新的属性、新的方法。
对父类的改造。比如,对方法的覆盖。

首先定义一个父类:Person,它有三个属性,分别由各自的存取方法来存取。

public class Person {
 private String name;

 private int age;

 private String sex;

 public String showName() {
  return name;
 }

 public void setName(String theName) {
  name = theName;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int theAge) {
  age = theAge;
 }

 public String getSex() {
  return sex;
 }

 public void setSex(String theSex) {
  sex = theSex;
 }
}


在这边,我们将它的属性的访问控制定义为Default,是因为在子类中我们需要访问这些属性。


接着,我们定义一个类“Teacher”,它继承“Person”类。

public class Teacher extends Person {
 // 扩充父类属性
 private String department;

 // 扩充父类方法
 public void setDepartment(String theDept) {
  department = theDept;
 }

 public String getDepartment() {
  return department;
 }

 // 方法覆盖
 public String showName() {
  return name + "老师";
 }

 // 测试
 public static void main(String[] args) {
  Teacher t = new Teacher();
  t.setName("Alex");
  System.out.println(t.showName());
 }
}


在这个子类中,继承了父类,新增了一个“部门”的属性:department,并新增了相应的存取方法。改写(覆盖)了父类中的showName()方法,在姓名后面加上“老师”后返回。

 

因为在同一个包中的子类中用到了父类的属性name,所以,父类Person中的name属性不能定义为private的。最后定义了一个main()方法用于测试。

 

执行这个程序,在控制台上将会输出如下信息:
Alex老师


在程序中加入一个main()方法用于测试一个类是不错的主意,无论这个类是否是一个Java应用程序(Java Application)。

 

你可以通过类的main()方法测试这个类的各个方法是否与你的设计相一致。

分享到:
评论

相关推荐

    MOD09-User-Guide-V61.pdf

    MODIS是安装在NASA的Terra和Aqua卫星上的遥感仪器,用于监测地球表面的各种参数,包括土地覆盖、植被状况、海洋颜色和大气特性。 C61版的MOD09产品在格式上与Collection 6(C6)保持一致,但其科学算法没有变化。...

    《中国电信2009年EVDO网络优化技术白皮书》

    3.4.2 1X/DO 双网协同优化方法........................................................................19 3.4.3 DO 网络路测优化...............................................................................

    MCD12Q2-User-Guide-V61.pdf

    EVI2 是一种经过改进的植被指数,能更准确地反映植被的生长状况,特别是在高植被覆盖率地区。 MCD12Q2 6.1 版本的核心特征在于它能够识别并记录每年最多两个生长周期,具有500米的空间分辨率。对于那些存在两个及...

    2021年教师招聘考试题库《教育理论综合知识》必看考点带答案解析_61.docx

    【教育理论综合知识】是教师招聘考试的重要组成部分,主要涵盖了教育学、心理学、教育法规等多个领域。...这些知识点覆盖了教育学、心理学、教育管理等多个领域,对于教师招聘考试的备考者来说是非常重要的复习资料。

    PCL61x4到PCL61x5的转换说明(日文版).pdf.pdf

    PCL61x5系列中则仅使用PCS输入端子,不进行目标位置覆盖。 2-4. ERC输出条件的变化: 在PCL61x4系列中,只有在RENV1.EROE=1且立即停止时,才会输出电机驱动器内部偏差计数器的清除信号(ERC)。而在PCL61x5系列中,...

    C#语言参考(共285页)

    1.7.3 方法...............................21 1.7.4 属性...............................22 1.7.5 事件...............................23 1.7.6 操作符...........................24 1.7.7 索引...................

    百米路由HQ61刷波讯1.58固件教程.docx

    最后,如果刷入Breed后,应先修改固件的MAC地址,取消"保留现有BootLoader"和"保留现有ART"选项,以便新固件覆盖原有内容并使MAC地址更改生效。整个刷机过程需要注意每个步骤的细节,以避免可能导致的问题。 总的来...

    微软 C#语言参考 CHM格式

    10.5.4 覆盖方法... 187 10.5.5 抽象方法... 189 10.5.6 外部方法... 190 10.5.7 方法主体... 191 10.5.8 方法重载... 191 10.6 属性... 191 10.6.1 静态属性... 192 10.6.2 虚拟属性... 192 10.6.3 覆盖属性... 193...

    Logback用户手册中文版

    3.10.7. 覆盖默认的累积行为 .......................................................................... 34 3.10.8. 设置上下文名称 ...........................................................................

    单片机——凌阳61板入门.rar

    总的来说,这个压缩包提供了一套完整的凌阳61单片机学习资源,覆盖了从理论到实践的多个方面。通过深入阅读和实践,读者不仅可以掌握单片机的基础知识,还能培养解决实际问题的能力,为后续的嵌入式系统开发打下坚实...

    艾瑞 中国电子支付行业发展报告 完整版

    研究方法............................................................................................................................9 V. 报告摘要.........................................................

    西门子电动执行器说明书.pdf

    本说明书详细介绍了电动执行器的型号、技术参数、安装和使用方法。 1. 产品系列与型号 西门子电动执行器包含了SQL321B和SQL361B两个系列。这两个系列的执行器都适用于VKF42系列蝶阀,并且具有以下工作电压和控制...

    61平方根.ppt

    这篇内容主要讲解了平方根的概念及其应用,特别关注了算术平方根的定义和性质。...总之,这个内容覆盖了算术平方根的基础知识,包括定义、计算方法以及实际应用,并通过实例帮助学生理解和掌握这些概念。

    iPhone开发秘籍.part2.rar

    2.13 小结.....61 第3章视图控制器......63 3.1 视图管理.....63 3.1.1 核心类.....63 3.1.2 专用类.....64 3.1.3 创建UIViewController...64 3.2 使用Interface Builder 为UIView- Controller 构建视图.....66 ...

    iPhone开发秘籍.part4.rar

    2.13 小结.....61 第3章视图控制器......63 3.1 视图管理.....63 3.1.1 核心类.....63 3.1.2 专用类.....64 3.1.3 创建UIViewController...64 3.2 使用Interface Builder 为UIView- Controller 构建视图.....66 ...

    iPhone开发秘籍.part1.rar

    2.13 小结.....61 第3章视图控制器......63 3.1 视图管理.....63 3.1.1 核心类.....63 3.1.2 专用类.....64 3.1.3 创建UIViewController...64 3.2 使用Interface Builder 为UIView- Controller 构建视图.....66 ...

Global site tag (gtag.js) - Google Analytics