以下内容引用自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中的重写的更多相关文章

  1. Java中方法重写和方法重载

     首先方法重写和方法重载是建立在Java的面向对象的继承和多态的特性基础上而出现的.至于面向对象的继承和多态的特性我就不在这里多说了.继承是指在一个父类的基础再创建一个子类,这样子类就拥有了父类的非私 ...

  2. java中为什么重写equals时必须重写hashCode方法?

    在上一篇博文Java中equals和==的区别中介绍了Object类的equals方法,并且也介绍了我们可在重写equals方法,本章我们来说一下为什么重写equals方法的时候也要重写hashCod ...

  3. java 中为什么重写 equals 后需要重写 hashCode

    本文为博主原创,未经允许不得转载: 1. equals 和 hashCode 方法之间的关系 这两个方法都是 Object 的方法,意味着 若一个对象在没有重写 这两个方法时,都会默认采用 Objec ...

  4. java中的重写与重载

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类 ...

  5. JAVA中ArrayList重写比较方法

    ArrayList的sort方法重写: 当ArrayList中存放的为含有多个成员变量的数据类型时,在进行sort排序时要重写比较方法,一般都写在这个数据类型类的内部如: package 算法竞赛入门 ...

  6. java中的重写总结

    这个理解了就挺容易的~~ 我就直接贴个程序啦 ,程序里有说明!! 父类: package ParentAndSon; public class Parent extends Object {//4:以 ...

  7. Java中URL重写(urlrewrite+Maven)

    一.UrlRewrite的作用   UrlRewrite即地址重写,用户得到的全部都是经过处理后的URL地址.将我们的动态网页地址转化为静态的地址,如html.shtml,还可以隐藏网页的真正路径.此 ...

  8. Java中方法的重写与成员变量的隐藏

    这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量) 在讨论这个问题之前,我们看一段特别特别简单的代码,请问一下方法的数据结果是什么? public class ...

  9. [转帖]Java中重写和重载与多态的关系

    Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67  收藏 更多 分类专栏: java进阶之路   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

随机推荐

  1. 怎么用eclipse生成jar文件?eclipse导出jar介绍

    1 .我们先要增加jar需要的配置文件,选中项目的src目录,鼠标右键,选择 [New] -选择 [Folder] . 2. 输入META-INF 作为目录名称,点击[Finish] . 3. 选中刚 ...

  2. leetcode_1039. Minimum Score Triangulation of Polygon_动态规划

    https://leetcode.com/problems/minimum-score-triangulation-of-polygon/ 题意:给定一个凸的N边形(N<=50),每个顶点有一个 ...

  3. Android(java)学习笔记160:开发一个多界面的应用程序之清单文件

    清单文件的重要参数:     <intent-filter>             代表的应用程序的入口界面           <action android:name=&quo ...

  4. mybatis中存储过程的调用

    dao层 // 调用存储过程 void callProcedureGrantEarnings(@Param("params") Map<String,Object> p ...

  5. python基础一 day2 数据类型

    int:        bool: 类型转换: str到int有条件,str必须是数字, "123e"是错误的 bool转换为int类型,需要int(x)  结果:  结果: 空字 ...

  6. PYTHON_DAY_02

    今日内容: 01 列表内置方法 '''''' ''' 列表: 定义: 在[]内,可以存放多个任意类型的值, 并以逗号隔开. 一般用于存放学生的爱好,课堂的周期等等... ''' # 定义一个学生列表, ...

  7. C ++ _基础之共用体

    由以下代码来进一步学习共用体 #include <stdio.h> #include<iostream> void main() { union un { int a; cha ...

  8. [LOJ] 分块九题 3

    https://loj.ac/problem/6279 区间修改,区间查询前驱. TLE无数,我觉得这代码最精髓的就是block=1000. 谜一样的1000. 两个启示: 块内可以维护数据结构,比如 ...

  9. <Spring Cloud>入门五 hystrix

    1.服务熔断 1.1引入坐标 <dependency> <groupId>org.springframework.cloud</groupId> <artif ...

  10. memcached 的内存管理与删除机制

    1:内存的碎片化 如果用 c 语言直接 malloc,free 来向操作系统申请和释放内存时, 在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用. 这种空闲,但无法利用内存的现象,--- ...