一、什么是重写

在子类中创建了一个与父类中名称相同、返回值类型相同、参数列表的方法相同,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖、方法复写。

二、为什么需要重写

原有的方法无法满足新的需求,需要对这个方法进行改良来满足新的需求。重写是出现在子类继承父类方法中。可以看出,重写就是子类继承的父类方法无法满足子类的新的功能需求,子类对父类的这个方法进行改良重写的一种方式。子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。

三、重写的条件/规则

重写只跟非静态方法(成员方法)有关,而与静态方法无关:

静态方法和非静态方法是不一样的:在静态方法中,方法的调用只和左边声明的对象类型有关,而与右边无关,是哪个类型,就调用对应的方法。

同时,静态方法是在idea中无法使用快捷键(Alt+Insert==》选择Overrider Methods)快速的生成重写的方法:

非静态方法:

非静态方法可以由idea创建重写的方法:

总结:

父类的成员方法只能被它的子类重写。

声明为 static 的方法不能被重写,但是能够再次声明。

2.     方法名必须相同;

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

参数列表必须相同;

修饰符:范围可以扩大但不能缩小:public>Protected>Default;

抛出的异常:范围,可以被缩小,但不能扩大;

子类的方法和父类必要一致;方法体不同!;

每种动物都有名字和年龄属性,但是喜欢吃的食物是不同的,比如狗喜欢吃骨头、猫喜欢吃鱼等,因此每种动物的介绍方式是不一样的。Dog通过重写Animal的方法来表现狗特有的行为特征。

Animal父类:

public class Animal {

public void shout(){

System.out.println("动物都会叫");

}

void move(){

System.out.println("动物都会走");

}

protected void eat(String food){

System.out.println("动物都会吃食物");

}

private void breed(){

System.out.println("动物需要繁衍");

}

}

Dog子类:

public class Dog extends Animal{

@Override

public void shout() {

System.out.println("汪汪汪");

}

@Override

void move() {

System.out.println("狗用四只腿跑");

}

@Override

protected void eat(String food) {

System.out.println("啃骨头");

System.out.println("狗还要吃"+food);

}

}

对类进行实例化:

public class AnimalTest {

public static void main(String[] args) {

Animal a = new Animal();

//尽管 b 属于 Animal 类型,但是它运行的是 Dog 类的 move方法

Animal b = new Dog();

a.shout();

a.move();

a.eat("水");

//a.breed(); 私有属性,无法在类以外使用

b.shout();

b.move();

b.eat("肉");

}

}

在上面的例子中可以看到,尽管 b 属于 Animal 类型,但是它运行的是 Dog 类的方法。这是由于在编译阶段,只是检查参数的引用类型。然而在运行时,Java 虚拟机(JVM)指定对象的类型并且运行该对象的方法。因此在上面的例子中,之所以能编译成功,是因为 Animal 类中存在 move 方法,然而运行时,运行的是特定对象的方法。

以上实例编译运行结果如下

动物都会叫

动物都会走

动物都会吃食物

汪汪汪

狗用四只腿跑

啃骨头

狗还要吃肉

四、重写的注意事项

重写的方法可以使用 @Override 注解来标识。

构造方法不能被重写。

声明为 final 的方法不能被重写。

子类和父类在同一个包中时,子类可以重写父类除了声明为 private 和 final 方法的其他方法。

子类和父类不在同一个包中时,子类只能重写父类的声明为 public 和 protected 的非 final 方法。

如果不能继承一个方法,则不能重写这个方法。重写是在继承的基础上,如果方法无法被继承那么就无法重写

五、super关键字的使用

当需要在子类中调用父类的被重写方法时,要使用 super 关键字。

public class Animal {

public void shout(){

System.out.println("动物都会叫");

}

}

子类调用父类的shout()方法:

public class Dog extends Animal{

@Override

public void shout() {

super.shout();

System.out.println("汪汪汪");

}

}

public class AnimalTest {

public static void main(String[] args) {

Animal b = new Dog();

b.shout();

}

}

运行结果

动物都会叫

汪汪汪

java 重写_Java的重写相关推荐

  1. java compareto重写_Java 关于重写compareTo方法

    概述 "当一个类实现类Comparable接口,此类就可以跟很多泛型算法(generic algorithm) 以及依赖于该接口 的集合实现(Collection implementatio ...

  2. java 接口重写_java如何实现接口中的重写

    普通类implements接口 1.普通方法,抽象方法都得重写: 2.默认方法可重写,也可不重写. 抽象类implements接口 在线视频教程分享:java教学视频 由抽象类来实现接口,则不必重写接 ...

  3. java 非法重载_JAVA中重写和重载区别

    重写和重载区别 重写方法的规则如下: 参数列表:必须与被重写方法的参数列表完全匹配. 返回类型:必须与超类中被重写的方法中声明的返回类型或子类型完全相同 访问级别:一定不能比被重写方法强,可以比被重写 ...

  4. java 继承重写_java 封装 继承 重写 多态

    封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处: 将变化隔离.便于使用.提高重用性.提高安全性 封装原则: 将不需要对外提供的内容都隐藏起来.把属性都隐藏,提供公共方法对其访问. ...

  5. java中重载与重写的区别

    最近了解一下重载和重写  一.重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading ...

  6. java 实现接口后重写方法报错

    java 实现接口后重写方法报错 java 实现接口后重写方法报错 The method contextDestroyed(ServletContextEvent) of type InitListe ...

  7. Java拾遗:001 - 重写 equals 和 hashCode 方法

    2019独角兽企业重金招聘Python工程师标准>>> 重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被 ...

  8. 类与接口(五)java多态、方法重写、隐藏

    一.Java多态性 面向对象的三大特性:封装.继承.多态. 多态的类型,分为以下两种: 编译时多态: 指的是 方法重载.编译时多态是在编译时确定调用处选择那个重载方法,所以也叫 静态多态,算不上真正的 ...

  9. java重载与重写的区别+重写父类equals方法的完美实现

    [0]README 0.1) 本文章节[1]和[2]的内容转自 http://www.cnblogs.com/bluestorm/archive/2012/03/01/2376236.html : 旨 ...

最新文章

  1. 数据库字典php样色,使用PHP一键生成MySQL数据库字典
  2. 辽师836c语言真题,2018年武汉科技大学考研真题硕士研究生入学考试试题
  3. hdu 1003 dp
  4. pygame加载MP3音乐
  5. BZOJ 1013 JSOI2008 球形空间产生器sphere 高斯消元
  6. topcoder srm 711 div1 -3
  7. mysql 5.7巡检脚本_mysql自动化巡检脚本生成html报告
  8. Linux系统LVM逻辑卷工作原理,必看~
  9. ContentServer迁移的几个步骤
  10. mysql中on关键字和where关键字
  11. 【期末复习】电子商务
  12. wegt安装tomcat镜像use --no-check-certificate
  13. 武汉最牛批的互联网基本都在这了~
  14. C# Activator和new的区别
  15. 地铁 综合监控设备 及其所属子系统
  16. JPEG编码压缩率调整
  17. FW:维度打击,机器学习中的降维算法:ISOMAP  MDS_拔剑-浆糊的传说_新浪博客...
  18. 远程启动IDEA时报错Startup Error: Unable to detect graphics environment
  19. 阿里那些吊炸天的开源工具,你知道几个?
  20. Java实现-五子棋

热门文章

  1. 测试工程师用 Shell 定位 Bug 的正确姿势 | 福利
  2. python 随机生成不重复的6位数_随机生成6位数、随机生成不重复的6位数
  3. 最优化原理与方法 BFGS算法及PRP算法
  4. protostuff java_java protostuff 序列化反序列化工具
  5. 交换学生(Foreign Exchange)
  6. 本地mysql访问线上_MySQL线上与本地实时同步
  7. loam 框架流程描述
  8. 北京/上海内推 | 小红书智能创作组招聘AIGC方向业务实习生
  9. Socket编程学习
  10. Linux之ps命令、pstree命令详解