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

java中重写的作用_Java中的重写

如果一个类从它的父类继承了一个方法,如果这个方法没有被标记为final ,就可以对这个方法进行重写。

重写的好处是:能够定义特定于子类类型的行为,这意味着子类能够基于要求来实现父类的方法。

在面向对象编程中,覆盖方法意味着去重写已经存在的方法。

示例:

来看以下的例子:

classAnimal{public voidmove(){

System.out.println("Animals can move");

}

}class Dog extendsAnimal{public voidmove(){

System.out.println("Dogs can walk and run");

}

}public classTestDog{public static voidmain(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方法,程序会正常编译。在运行时,会运行特定对象的方法。

考虑下面的例子:

classAnimal{public voidmove(){

System.out.println("Animals can move");

}

}class Dog extendsAnimal{public voidmove(){

System.out.println("Dogs can walk and run");

}public voidbark(){

System.out.println("Dogs can bark");

}

}public classTestDog{public static voidmain(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:classAnimal

b.bark();

这个程序在编译时将抛出一个错误,因为b的引用类型Animal没有一个名字叫bark的方法。

一、方法重写规则

重写方法的参数列表应该与原方法完全相同。

返回值类型应该和原方法的返回值类型一样或者是它在父类定义时的子类型。

重写函数访问级别限制不能比原函数高。举个例子:如果父类方法声明为公有的,那么子类中的重写方法不能是私有的或是保护的。

只有被子类继承时,方法才能被重写。

方法定义为final,将导致不能被重写。

一个方法被定义为static,将使其不能被重写,但是可以重新声明。

一个方法不能被继承,那么也不能被重写。

和父类在一个包中的子类能够重写任何没有被声明为private和final的父类方法。

和父类不在同一个包中的子类只能重写non-final方法或被声明为public或protected的方法。

一个重写方法能够抛出任何运行时异常,不管被重写方法是否抛出异常。然而重写方法不应该抛出比被重写方法声明的更新更广泛的已检查异常。重写方法能够抛出比被重写方法更窄或更少的异常。

构造函数不能重写。

二、使用super关键字

当调用父类的被重写的方法时,要用关键字super。

classAnimal{public voidmove(){

System.out.println("Animals can move");

}

}class Dog extendsAnimal{public voidmove(){super.move(); //invokes the super class method

System.out.println("Dogs can walk and run");

}

}public classTestDog{public static voidmain(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

相关文章:

  • java def_java 8 default关键字
  • java url xml_从Java中的URL读取XML字符串
  • java 8 关键字_JAVA 8 '::' 关键字
  • java类中静态块_java – 为什么.class不调用类中的静态块?
  • java referrer_JavaScript中document.referrer的用法详解
  • java代码压缩文件_使用Java代码压缩文件或文件夹
  • 石子合并 动态规划 java_动态规划:圆形石子合并问题
  • java修饰方法_Java 修饰符
  • arduino timer频率_Arduino利用TimerOne库产生固定频率和占空比的方波
  • flask数据库mysql增删查改_flask_sqlalchemy简单增删查改操作
  • java基础语法的意义_关于java基础语法的学习笔记
  • java中容器试题_Java最常见208道面试题_容器
  • java 开启线程扫描程序_当多个线程在Java中使用System.in上的扫描仪...
  • java中结构体实现_JAVA中如何实现C中的结构体数组的功能?
  • java nio close_wait_Java NIO 操作总结
  • 【comparator, comparable】小总结
  • 2019.2.20 c++ 知识梳理
  • Angular2开发踩坑系列-生产环境编译
  • Cumulo 的 ClojureScript 模块已经成型
  • docker-consul
  • github从入门到放弃(1)
  • HTTP中GET与POST的区别 99%的错误认识
  • HTTP中的ETag在移动客户端的应用
  • Iterator 和 for...of 循环
  • Javascript编码规范
  • JS+CSS实现数字滚动
  • Koa2 之文件上传下载
  • MySQL-事务管理(基础)
  • ng6--错误信息小结(持续更新)
  • vue-cli在webpack的配置文件探究
  • windows下如何用phpstorm同步测试服务器
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 搭建gitbook 和 访问权限认证
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 数据可视化之 Sankey 桑基图的实现
  • 最近的计划
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 第二十章:异步和文件I/O.(二十三)
  • ​【已解决】npm install​卡主不动的情况
  • ​如何防止网络攻击?
  • #13 yum、编译安装与sed命令的使用
  • #微信小程序:微信小程序常见的配置传旨
  • (3)选择元素——(17)练习(Exercises)
  • (4.10~4.16)
  • (8)STL算法之替换
  • (附源码)计算机毕业设计ssm电影分享网站
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (算法)Game
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)德国人的记事本
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • ./configure,make,make install的作用