A、重写规则之一:

  重写方法不能比被重写方法限制有更严格的访问级别。 (但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限。)

  比如:Object类有个toString()方法,开始重写这个方法的,时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们 的机会。出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的。

B、重写规则之二:

  参数列表必须与被重写方法的相同。 重写有个孪生的弟弟叫重载,也就是后面要出场的。如果子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。

C、重写规则之三:

  返回类型必须与被重写方法的返回类型相同。

  父类方法A:void eat(){} 子类方法B:int eat(){} 两者虽然参数相同,可是返回类型不同,所以不是重写。 父类方法A:int eat(){} 子类方法B:long eat(){} 返回类型虽然兼容父类,但是不同就是不同,所以不是重写。

D、重写规则之四:

  重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。

 import java.io.*;

   public class Test {
    public static void main (String[] args){
      Animal h = new Horse();
      try {
        h.eat();
      } catch (Exception e) {       }
    }
  }   class Animal {
    public void eat()
    throws Exception{
      System.out.println ("Animal is eating.");
      throw new Exception();
    }
  }   class Horse extends Animal{
    public void eat()     throws IOException{
      System.out.println ("Horse is eating.");
      throw new IOException();
    }
  }

  这个例子中,父类抛出了检查异常Exception,子类抛出的IOException是Exception的子类,也即是比被重写的方法抛出了 更有限的异常,这是可以的。如果反过来,父类抛出IOException,子类抛出更为宽泛的Exception,那么不会通过编译的。

  注意:这种限制只是针对检查异常,至于运行时异常RuntimeException及其子类不再这个限制之中。

E、重写规则之五:

  不能重写被标识为final的方法。

F、重写规则之六:

  如果一个方法不能被继承,则不能重写它。 比较典型的就是父类的private方法。

  下例会产生一个有趣的现象。

 public class Test {
    public static void main (String[] args) {
      //Animal h = new Horse();
      Horse h = new Horse();
      h.eat();
    }
  }   class Animal {
    private void eat(){
      System.out.println ("Animal is eating.");
    }
  }   class Horse extends Animal{
    public void eat(){
      System.out.println ("Horse is eating.");
    }
  }

  这段代码是能通过编译的。表面上看来违反了第六条规则,但实际上那是一点巧合。Animal类的eat()方法不能被继承,因此Horse类中的 eat()方法是一个全新的方法,不是重写也不是重载,只是一个只属于Horse类的全新的方法!这点让很多人迷惑了,但是也不是那么难以理解。

  main()方法如果是这样: Animal h = new Horse(); //Horse h = new Horse(); h.eat(); 编译器会报错,为什么呢?Horse类的eat()方法是public的啊!应该可以调用啊!

  这里就牵扯到一个向上转型的概念了,当父类引用了子类的一个实例时,子类复写了父类的方法会覆盖父类中相同的方法,但子类中有而父类中没有的方法父类就无法调用。在这个例子中,由于Animal中的eat方法是private的,所以子类中的eat方法不算复写了父类的eat方法,这是一个新方法,所以调用父类的eat方法时,就无法调用子类的eat方法,而父类的eat方法为private,所以发生了错误。

  请牢记,多态只看父类引用的方法,而不看子类对象的方法。

【JAVA】java方法覆写规则的更多相关文章

  1. [改善Java代码]推荐覆写toString方法

    建议49: 推荐覆写toString方法 为什么要覆写toString方法,这个问题很简单,因为Java提供的默认toString方法不友好,打印出来看不懂,不覆写不行,看这样一段代码: public ...

  2. [改善Java代码]不要覆写静态方法

    建议33: 不要覆写静态方法 我们知道在Java中可以通过覆写(Override)来增强或减弱父类的方法和行为,但覆写是针对非静态方法(也叫做实例方法,只有生成实例才能调用的方法)的,不能针对静态方法 ...

  3. JAVA继承与覆写

    实例:数组操作 首先是开发一个整型数组父类,要求从外部控制数组长度,并实现保存数据以及输出.然后子类中实现排序和反转. 基础父类代码如下: class Array { private int data ...

  4. java继承与覆写小练习

    最近学习java到了继承的部分,写个小程序用以巩固. import java.util.Scanner;//导入输入包public class testfather { public static v ...

  5. java重载与覆写

    很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参 ...

  6. 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

    1.Object介绍 Object类是一个特殊的类,是所有类(包括数组,接口 )的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类,所以可以通过向上转型的方法使用 ...

  7. java 的方法注释写在哪里?

    如果有接口,写在接口方法上即可.鼠标滑过方法名时时会显示 如果没有接口,写在每个方法上方. eclipse 分三步 ① 找到方法,并将光标移动至方法名的上方 ②/** ③回车 那,效果是酱紫

  8. JAVA中继承时方法的重载(overload)与重写/覆写(override)

    JAVA继承时方法的重载(overload)与重写/覆写(override) 重载-Override 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就 ...

  9. Java中的overload(方法的覆写)

    方法覆写(overload)与方法的重载非常相似,它在 Java的继承中也有很重要的应用. 写程序可能会碰到下面的情况,在父类中已经实现的方法可能不够精确,不能满足子类 的需求.例如在前面的 Anim ...

随机推荐

  1. Android中如何下载文件并显示下载进度

    原文地址:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1125/2057.html 这里主要讨论三种方式:AsyncTask.Serv ...

  2. 停止Nginx服务

    查询nginx进程信息 chen@ubuntu:~$ ps -ef |grep nginx root : ? :: nginx: master process /usr/sbin/nginx -g d ...

  3. 小规模kvm宿主机管理-webvirtmgr安装

    1.前言WebVirtMgr是近两年来发展较快,比较活跃,非常清新的一个KVM管理平台,提供对宿主机和虚机的统一管理,它有别于kvm自带的图形管理工具(virtual machine manager) ...

  4. React杂篇(1) -- 打包发布注意事项

    打包后资源路径 问题:直接打包会出现一下情况: 方式一: package.json文件下加入homepage字段 { "name": "wap-v2", &qu ...

  5. javascript按键盘上/右/下/左箭头加速运动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 【转】在Win10家庭版中启用组策略

    源地址:https://www.baidu.com/link?url=tZrD7LVxQEKQUTWUum86LoxyaxWNLs5BeBE2K36TliRi8sjGraKc-iP3TEm6sc_KX ...

  7. 【转】C#工程连接oracle的一种方式

    源地址:https://blog.csdn.net/qq_16542775/article/details/52689068 项目中有个功能需要从一台Oracle数据库获取数据,本以为是很简单的事情, ...

  8. scrapy中通过set()方法进行数据过滤去重

    我们经常在抓取数据是碰到 数据重复的问题,除了radis数据库去重功能外,还有一种简便的过滤方法, 来来 我们直接上代码: pipelines.py中: from scrapy.exceptions ...

  9. 洛谷P3358 最长k可重区间集问题(费用流)

    传送门 因为一个zz错误调了一个早上……汇点写错了……spfa也写错了……好吧好像是两个…… 把数轴上的每一个点向它右边的点连一条边,容量为$k$,费用为$0$,然后把每一个区间的左端点向右端点连边, ...

  10. Python里生成器的问题

    任何包含yield语句的函数称为生成器.