当前位置: 首页 > news >正文

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

==>如有问题,请联系我:easonjim#163.com,或者下方发表评论。<==

相关文章:

  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • TeamCity 2017.1.2 发布,持续集成工具
  • 微软:请叫我 Android 预装服务提供商
  • arcgis engine 获取高亮Feature、element
  • Java -- JDBC 学习--PreparedStatement
  • Vijos P1303 导弹拦截【最长上升子序列+DP】
  • Ta-Lib用法介绍 !
  • 负载均衡方案对比表
  • select标签中option内容加链接
  • kibana创建新的index patterns
  • 使用docker搭建android源码编译环境
  • 使用Android Studio运行NDK程序
  • Foreman 1.15.1 发布,数据中心生命周期管理工具
  • C学习-枚举(九)
  • 关于网易云音乐爬虫的api接口?
  • Fundebug计费标准解释:事件数是如何定义的?
  • HTTP中GET与POST的区别 99%的错误认识
  • javascript 总结(常用工具类的封装)
  • Mac转Windows的拯救指南
  • python大佬养成计划----difflib模块
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 编写符合Python风格的对象
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从重复到重用
  • 检测对象或数组
  • 三栏布局总结
  • 说说动画卡顿的解决方案
  • 自动记录MySQL慢查询快照脚本
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计高校学生选课系统
  • (四)库存超卖案例实战——优化redis分布式锁
  • (四)图像的%2线性拉伸
  • (一)kafka实战——kafka源码编译启动
  • (转)Oracle存储过程编写经验和优化措施
  • (转载)从 Java 代码到 Java 堆
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET 4.0中的泛型协变和反变
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 解决重复提交问题
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @SuppressWarnings(unchecked)代码的作用
  • [20160807][系统设计的三次迭代]
  • [30期] 我的学习方法
  • [autojs]autojs开关按钮的简单使用
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [Bada开发]初步入口函数介绍
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具