在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()方法测试这个类的各个方法是否与你的设计相一致。
分享到:
相关推荐
MODIS是安装在NASA的Terra和Aqua卫星上的遥感仪器,用于监测地球表面的各种参数,包括土地覆盖、植被状况、海洋颜色和大气特性。 C61版的MOD09产品在格式上与Collection 6(C6)保持一致,但其科学算法没有变化。...
3.4.2 1X/DO 双网协同优化方法........................................................................19 3.4.3 DO 网络路测优化...............................................................................
EVI2 是一种经过改进的植被指数,能更准确地反映植被的生长状况,特别是在高植被覆盖率地区。 MCD12Q2 6.1 版本的核心特征在于它能够识别并记录每年最多两个生长周期,具有500米的空间分辨率。对于那些存在两个及...
【教育理论综合知识】是教师招聘考试的重要组成部分,主要涵盖了教育学、心理学、教育法规等多个领域。...这些知识点覆盖了教育学、心理学、教育管理等多个领域,对于教师招聘考试的备考者来说是非常重要的复习资料。
PCL61x5系列中则仅使用PCS输入端子,不进行目标位置覆盖。 2-4. ERC输出条件的变化: 在PCL61x4系列中,只有在RENV1.EROE=1且立即停止时,才会输出电机驱动器内部偏差计数器的清除信号(ERC)。而在PCL61x5系列中,...
1.7.3 方法...............................21 1.7.4 属性...............................22 1.7.5 事件...............................23 1.7.6 操作符...........................24 1.7.7 索引...................
最后,如果刷入Breed后,应先修改固件的MAC地址,取消"保留现有BootLoader"和"保留现有ART"选项,以便新固件覆盖原有内容并使MAC地址更改生效。整个刷机过程需要注意每个步骤的细节,以避免可能导致的问题。 总的来...
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...
3.10.7. 覆盖默认的累积行为 .......................................................................... 34 3.10.8. 设置上下文名称 ...........................................................................
总的来说,这个压缩包提供了一套完整的凌阳61单片机学习资源,覆盖了从理论到实践的多个方面。通过深入阅读和实践,读者不仅可以掌握单片机的基础知识,还能培养解决实际问题的能力,为后续的嵌入式系统开发打下坚实...
研究方法............................................................................................................................9 V. 报告摘要.........................................................
本说明书详细介绍了电动执行器的型号、技术参数、安装和使用方法。 1. 产品系列与型号 西门子电动执行器包含了SQL321B和SQL361B两个系列。这两个系列的执行器都适用于VKF42系列蝶阀,并且具有以下工作电压和控制...
这篇内容主要讲解了平方根的概念及其应用,特别关注了算术平方根的定义和性质。...总之,这个内容覆盖了算术平方根的基础知识,包括定义、计算方法以及实际应用,并通过实例帮助学生理解和掌握这些概念。
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 ...
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 ...
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 ...