java的重写_java 类的重写-程序员宅基地

技术标签: java  java学习  


文章内容选自尚硅谷

重写的一般用法

java的重写是为了子类在继承父类方法的时候,需要用到父类的方法,但是方法体又和父类不完全一样,因此得在子类中创建一个和父类同名同参数的方法,实现方法的重写。

  • 方法的重写(override或overwrite)必须和父类同名,参数列表也相同
  • 重写后当子类调用父类的方法的时候,调用的是子类中重写的方法,而不是父类的方法。

代码如下,创建一个Person类

package com.atguigui.java;

public class Person {
    
	String name;
	int age;
	
	public Person(){
    
		
	}
	
	public Person(String name,int age){
    
		this.name = name;
		this.age = age;
	}
	
	public void eat(){
    
		System.out.println("吃饭");
		
	}
	
	public void walk(int distance){
    
		System.out.println("走路,走了:"+distance+"公里");
	}
}

再创建一个Student类,该类继承自Person类,并在Student类中重写了一个eat方法,如下所示:

package com.atguigui.java;

public class Student extends Person{
    
	String major;
	
	public Student(){
    
		
	}
	
	public Student(String major){
    
		this.major = major;
	}
	
	public void study(){
    
		System.out.println("学生的专业是:"+major);
	}
	
	public void eat(){
    
		System.out.println("学生吃饭");
	}
}

然后写一个PersonTest类的主方法

package com.atguigui.java;

public class PersonTest {
    
	public static void main(String[] args) {
    
		Student s = new Student("自动化");
		s.eat();
		s.walk(10);
		s.study();
	}
}

运行结果为

学生吃饭
走路,走了:10公里
学生的专业是:自动化

可见,在调用eat方法的时候,这儿输出的是Student类中重写后的eat方法,而不是在父类中定义的eat方法。

方法重写的具体要求

  • 子类中的方法叫重写的方法,父类中的方法叫被重写的方法
  • 子类中重写的方法和父类中被重写的方法要求方法名,形参列表相同,方法体不同。
  • 子类重写方法的权限修饰符不小于被重写方法的权限修饰符,特殊情况:子类不能重写父类中的带有private修饰符的方法。

假如在Person类中再定义了一个私有的show方法,把该私有的show方法放在公用的walk方法内部

package com.atguigui.java;

public class Person {
    
	String name;
	int age;
	
	public Person(){
    
		
	}
	
	public Person(String name,int age){
    
		this.name = name;
		this.age = age;
	}
	
	public void eat(){
    
		System.out.println("吃饭");
		
	}
	
	public void walk(int distance){
    
		System.out.println("走路,走了:"+distance+"公里");
		show();
		eat();
	}
	
	private void show(){
    
		System.out.println("我是一个人");
	}
}

然后在Student类中“重写”(这儿不会报错,但实际上构不成重写)了一个公用的show方法

package com.atguigui.java;

public class Student extends Person{
    
	String major;
	
	public Student(){
    
		
	}
	
	public Student(String major){
    
		this.major = major;
	}
	
	public void study(){
    
		System.out.println("学生的专业是:"+major);
	}
	
	public void eat(){
    
		System.out.println("学生吃饭");
	}
	
	public void show(){
    
		System.out.println("我是一个学生");
	}
}

再进行测试

package com.atguigui.java;

public class PersonTest {
    
	public static void main(String[] args) {
    
		Student s = new Student("自动化");
		s.walk(10);
	}
}

运行结果为

走路,走了:10公里
我是一个人
学生吃饭

可以看出walk中包含了show和eat方法,show方法在编译过程的时候虽然不会报错,但系统不会把子类中show方法看作是对父类show方法的重写,这是由于private封装性的影响,但是eat方法被正确重写了。

方法重写的具体要求还有

  • 若父类被重写方法的返回值类型是void,则子类重写方法的返回值类型也是void
  • 若父类被重写方法的返回值类型是A类型,则子类重写方法的返回值类型是A类或者是A类的子类(针对引用数据类型)
  • 若父类被重写方法的返回值类型是基本数据类型,则子类重写方法的返回值类型必须是相同的基本数据类型。
  • 子类重写方法抛出的异常类型不大于父类被重写方法抛出的异常类型。
  • 一般而言,在子类中重写方法的时候,直接把父类该方法的声明复制一份就行,即保持它权限修饰符,返回值类型,方法名,形参列表完全一致就行,这样是最常用的也是最大限度避免出错的方法。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Meloneating/article/details/113719264

智能推荐

USTC计算数论课程学习记录_连分数因子分解-程序员宅基地

文章浏览阅读1.4k次,点赞4次,收藏13次。文章目录1 大整数因子分解算法1.1 连分数因子分解1.2 二次筛法1.3 数域筛法1.4 Pollard ρ1.5 Pollard p-11.6 P+1算法1.7 椭圆曲线法2 离散对数2.1 小步大步法2.2 Silver-Hellman-Pholig3 模p开平方计算数论学习记录,如有错误,欢迎评论区指正。1 大整数因子分解算法寻找x2≡y2 (mod p)x^2\equiv y^2\ (mod\ p)x2≡y2 (mod p)来分解N。连分数、二次_连分数因子分解

数据结构 图 最短路径-程序员宅基地

文章浏览阅读199次。(1)从某个源点到其余各顶点的最短路径Dijkstra的代码如下:头文件:#defineINFINITY10000#defineMAX_VERTEX_NUM20typedefintInfoType;typedefcharVertexType;typedefintVRType;typedefenum...{DG,DN,UDG,UDN}GraphKind;typedefstructA..._please input the number of vertex n

mysql主备配置文件 my.cnf_my.cnf配置的server_id-程序员宅基地

文章浏览阅读5.5k次。主:[mysqld]lower_case_table_names=1datadir=/mnt/mysql/datasocket=/mnt/mysql/mysql.socklog-error=/mnt/mysql/log/mysqld.logpid-file=/mnt/mysql/mysqld.pidwait_timeout=2147483interactive_timeout=2147483character_set_server=utf8init_connect='SET._my.cnf配置的server_id

堆排序(c语言)_堆排序加入一个节点-程序员宅基地

文章浏览阅读278次,点赞10次,收藏7次。堆排序的效率在各种排序中有比较高的效率,时间复杂度为O(nlog2n)_堆排序加入一个节点

sqoop import hbase by kerberos安全认证下_sqoop 脚本添加kerbores认证-程序员宅基地

文章浏览阅读515次。2020-07-15 16:30:47,365 ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Can't get Master Kerberos principal for use as renewer at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesIntern_sqoop 脚本添加kerbores认证

ubuntu sublime支持中文_ubuntu sublim 中文字体-程序员宅基地

文章浏览阅读779次。1. 安装fcitx中文输入法或sougou拼音输入法 * `sudo apt-get install fcitx-pinyin` * sougou + `sudo add-apt-repository ppa:fcitx-team/nightly` + `sudo apt-get update` 添加软件源,在使用之前要先更新_ubuntu sublim 中文字体

随便推点

Ubuntu apt/apt-get安装sqliteman出现“E: 无法定位软件包”解决方案_无法定位软件包 sqliteman-程序员宅基地

文章浏览阅读2.9k次,点赞4次,收藏5次。前提:python初学者。自学过程中发现很多网上没有说清楚的解决方案,因此自己记录下来。老师让安装sqliteman:sudo apt install sqliteman提示:E: 无法定位软件包 sqliteman看网上主要是两种解决方案:1.换源。尝试后再安装还是同样的问题。2.第二种方式如下图:尝试了还是无法解决https://blog.csdn.net/Z_YMing/article/details/95041427男朋友是程序员,问了他以后,说让我先安装sqlite1/安装sqli_无法定位软件包 sqliteman

大学c语言第三章作业,c语言程序设计一章部分和第三章习题答案.doc-程序员宅基地

文章浏览阅读126次。c语言程序设计一章部分和第三章习题答案实 验 报 告课程名称 C语言程序设计A实验项目 编程环境认知与顺序程序设计实验仪器 PC机一台学 院_____信息管理学院_______专 业 信息管理与信息系统班级/学号 信管1302班学生姓名 吴玉元实验日期 2014年3月成 绩 _________________..._中国大学c语言程序设计单元测试第三章答案

Qt Charts 之 QChartView Class_qt class : public qchartview-程序员宅基地

文章浏览阅读7k次。详细描述QChartView是一个独立的图标小部件。QChartView是一个独立的可以显示图表的部件。它不需要分离的QGraphicsScene就可以工作。如果你想要在已经存在的QGraphicsScene中显示一个图表,你需要使用QChart(或者QPolarChart)类(来替代QChartView)。成员函数(API)QChartView::QChartVi_qt class : public qchartview

网络安全防护体系建设-程序员宅基地

文章浏览阅读8.9k次,点赞2次,收藏47次。构建适应数字化时代的网络安全防护体系,通过建立信任实现数字化业务的连接,通过控制风险抵御连接过程中的威胁,基于风险与信任的控制,保障网络安全防护体系落地。_网络安全防护体系

C语言—函数的引用_c语言引用函数-程序员宅基地

文章浏览阅读4k次。1.函数的定义 2.函数的返回语句 3.函数参数的应用 4.函数的调用_c语言引用函数

DA14531_写晶振校准值(xtrim)到OTP_14531 otp烧录-程序员宅基地

文章浏览阅读1.2k次。531写晶振校准值到OTP中开发过580/585的用户应该知道,想要将晶振校准值烧录到OTP中,我们只需往芯片的OTP Header中的某个固定的位置烧录一个两个字节的值即可。531的情况不太一样。DA14531的OTP Header分成了两部分: Configuration Script和Main group:其中,Main group存放一些常用的配置如:SPI FLASH 引脚,蓝牙 MAC 地址,时间戳等;特定的OTP位置位置,有其特定的含义。Configuration Script提供了比_14531 otp烧录