Java中的重写
以下内容引用自http://wiki.jikexueyuan.com/project/java/overriding.html:
如果一个类从它的父类继承了一个方法,如果这个方法没有被标记为final ,就可以对这个方法进行重写。
重写的好处是:能够定义特定于子类类型的行为,这意味着子类能够基于要求来实现父类的方法。
在面向对象编程中,覆盖方法意味着去重写已经存在的方法。
示例:
来看以下的例子:
class Animal{ public void move(){
System.out.println("Animals can move");
}
} class Dog extends Animal{ public void move(){
System.out.println("Dogs can walk and run");
}
} public class TestDog{ public static void main(String args[]){
Animal a = new Animal(); // Animal reference and object
Animal b = new Dog(); // Animal reference but Dog object a.move();// runs the method in Animal class b.move();//Runs the method in Dog class
}
}
//这将产生如下结果:
Animals can move
Dogs can walk and run
在上面的例子中,可以看到尽管b是Animal类型,但它运行了dog类的方法。原因是:在编译时会检查引用类型。然而,在运行时,JVM会判定对象类型到底属于哪一个对象。
因此,在上面的例子中,虽然Animal有move方法,程序会正常编译。在运行时,会运行特定对象的方法。
考虑下面的例子:
class Animal{ public void move(){
System.out.println("Animals can move");
}
} class Dog extends Animal{ public void move(){
System.out.println("Dogs can walk and run");
}
public void bark(){
System.out.println("Dogs can bark");
}
} public class TestDog{ public static void main(String args[]){
Animal a = new Animal(); // Animal reference and object
Animal b = new Dog(); // Animal reference but Dog object a.move();// runs the method in Animal class
b.move();//Runs the method in Dog class
b.bark();
}
}
//这将产生如下结果:
TestDog.java:30: cannot find symbol
symbol : method bark()
location: class Animal
b.bark();
这个程序在编译时将抛出一个错误,因为b的引用类型Animal没有一个名字叫bark的方法。
一、方法重写规则
- 重写方法的参数列表应该与原方法完全相同。
- 返回值类型应该和原方法的返回值类型一样或者是它在父类定义时的子类型。
- 重写函数访问级别限制不能比原函数高。举个例子:如果父类方法声明为公有的,那么子类中的重写方法不能是私有的或是保护的。
- 只有被子类继承时,方法才能被重写。
- 方法定义为final,将导致不能被重写。
- 一个方法被定义为static,将使其不能被重写,但是可以重新声明。
- 一个方法不能被继承,那么也不能被重写。
- 和父类在一个包中的子类能够重写任何没有被声明为private和final的父类方法。
- 和父类不在同一个包中的子类只能重写non-final方法或被声明为public或protected的方法。
- 一个重写方法能够抛出任何运行时异常,不管被重写方法是否抛出异常。然而重写方法不应该抛出比被重写方法声明的更新更广泛的已检查异常。重写方法能够抛出比被重写方法更窄或更少的异常。
- 构造函数不能重写。
二、使用super关键字
当调用父类的被重写的方法时,要用关键字super。
class Animal{ public void move(){
System.out.println("Animals can move");
}
} class Dog extends Animal{ public void move(){
super.move(); // invokes the super class method
System.out.println("Dogs can walk and run");
}
} public class TestDog{ public static void main(String args[]){ Animal b = new Dog(); // Animal reference but Dog object
b.move(); //Runs the method in Dog class }
}
//这将产生如下结果:
Animals can move
Dogs can walk and run
测试工程:https://github.com/easonjim/5_java_example/tree/master/javabasicstest/test18
Java中的重写的更多相关文章
- Java中方法重写和方法重载
首先方法重写和方法重载是建立在Java的面向对象的继承和多态的特性基础上而出现的.至于面向对象的继承和多态的特性我就不在这里多说了.继承是指在一个父类的基础再创建一个子类,这样子类就拥有了父类的非私 ...
- java中为什么重写equals时必须重写hashCode方法?
在上一篇博文Java中equals和==的区别中介绍了Object类的equals方法,并且也介绍了我们可在重写equals方法,本章我们来说一下为什么重写equals方法的时候也要重写hashCod ...
- java 中为什么重写 equals 后需要重写 hashCode
本文为博主原创,未经允许不得转载: 1. equals 和 hashCode 方法之间的关系 这两个方法都是 Object 的方法,意味着 若一个对象在没有重写 这两个方法时,都会默认采用 Objec ...
- java中的重写与重载
重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类 ...
- JAVA中ArrayList重写比较方法
ArrayList的sort方法重写: 当ArrayList中存放的为含有多个成员变量的数据类型时,在进行sort排序时要重写比较方法,一般都写在这个数据类型类的内部如: package 算法竞赛入门 ...
- java中的重写总结
这个理解了就挺容易的~~ 我就直接贴个程序啦 ,程序里有说明!! 父类: package ParentAndSon; public class Parent extends Object {//4:以 ...
- Java中URL重写(urlrewrite+Maven)
一.UrlRewrite的作用 UrlRewrite即地址重写,用户得到的全部都是经过处理后的URL地址.将我们的动态网页地址转化为静态的地址,如html.shtml,还可以隐藏网页的真正路径.此 ...
- Java中方法的重写与成员变量的隐藏
这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量) 在讨论这个问题之前,我们看一段特别特别简单的代码,请问一下方法的数据结果是什么? public class ...
- [转帖]Java中重写和重载与多态的关系
Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67 收藏 更多 分类专栏: java进阶之路 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
随机推荐
- UGUI世界坐标转换为UI本地坐标
以下是实现hud跟随3D物体的脚本,只是测试用,不是开发中的代码,脚本挂在任意游戏物体上 demo下载 using UnityEngine; public class SceneFollowUI : ...
- dumpkeys - 转储显示键盘翻译表
总览 (SYNOPSIS) dumpkeys [ -hilfn1 -Sshape -ccharset --help --short-info --long-info --numeric --full- ...
- JDK 5 ~ 11 新特性倾情整理
为了大家对JDK有一个全面的了解,下面我为大家整理了JDK5~11的所有关键新特性! 先看一下JDK的版本迭代图: 注: OpenJDK和JDK区别 GPL协议通用性公开许可证(General ...
- QT5:总结篇 控件集合
一.Layouts 二.Spacers 三.Buttons 四.Item Views(Model-Based) 五.Item Widgets(Item-Based) 六.Containers 七.In ...
- golang 解析json 动态数组
#cat file { "Bangalore_City": "35_Temperature", "NewYork_City": " ...
- NodeJs运行服务器-day01
//读取内置模块http,这个模块开发服务器用的var http =require('http'); var server=http.createServer(function(req,res){ r ...
- jquery-closest
1.closest() 本例演示如何通过 closest() 完成事件委托.当被最接近的列表元素或其子后代元素被点击时,会切换黄色背景: $( document ).bind("click& ...
- 【亲测可行】Dev c++调试、运行报错解决方法总结
一.编译后 0错误 0警告,但是开始出现‘‘停止运行’’或者进行输入时出现‘‘停止运行’’ 可能的原因: 结构体指针为空,但调用了其成员. 有些scanf语句中忘记添加取址符. 无法跳出递归. 二. ...
- Spoj8093 Sevenk Love Oimaster
题目描述 题解: 对于所有n串建广义后缀自动机. (广义后缀自动机唯一区别就是每次将las附成1,并不需要在插入时特判) 建完后再建出parent树,然后用dfs序+树状数组搞区间不同种类. 其实就是 ...
- Hibernate的核心配置
Hibernate的设计思路 Hibernate是一种全自动化管理持久化对象的ORM框架,既提供了完全面向对象的封装完整的对象持久化接口(屏蔽db层的差异化,提升代码可移植性),也提供了操作HQL和S ...