返回顶部
首页 > 资讯 > 精选 >Overriding的使用规则有哪些
  • 191
分享到

Overriding的使用规则有哪些

2023-06-15 18:06:32 191人浏览 薄情痞子
摘要

这篇文章主要讲解了“Overriding的使用规则有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Overriding的使用规则有哪些”吧!01、什么是重写?重写带来了一种非常重要的能力

这篇文章主要讲解了“Overriding的使用规则有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Overriding的使用规则有哪些”吧!

01、什么是重写?

重写带来了一种非常重要的能力,可以让子类重新实现从父类那继承过来的方法。在下面这幅图中,Animal 是父类,Dog 是子类,Dog 重新实现了  move() 方法用来和父类进行区分,毕竟狗狗跑起来还是比较有特色的。

Overriding的使用规则有哪些

重写的方法和被重写的方法,不仅方法名相同,参数也相同(也就说是方法签名相同),只不过,方法体有所不同。

02、哪些方法可以被重写?

规则一:只能重写继承过来的方法。

因为重写是在子类重新实现从父类继承过来的方法时发生的,所以只能重写继承过来的方法,这很好理解。这就意味着,只能重写那些被 public、protected  或者 default 修饰的方法,private 修饰的方法无法被重写。

Animal 类有 move()、eat() 和 sleep() 三个方法:

public class Animal {     public void move() { }      protected void eat() { }          void sleep(){ } }

Dog 类来重写这三个方法:

public class Dog extends Animal {     public void move() { }      protected void eat() { }      void sleep(){ } }

OK,完全没有问题。但如果父类中的方法是 private 的,就行不通了。

public class Animal {     private void move() { } }

此时,Dog 类中的 move() 方法就不再是一个重写方法了,因为父类的 move() 方法是 private 的,对子类并不可见。

public class Dog extends Animal {     public void move() { } }

03、哪些方法不能被重写?

规则二:final、static 的方法不能被重写。

一个方法是 final 的就意味着它无法被子类继承到,所以就没办法重写。

public class Animal {     final void move() { } }

由于父类 Animal 中的 move() 是 final 的,所以子类在尝试重写该方法的时候就出现编译错误了!

Overriding的使用规则有哪些

同样的,如果一个方法是 static 的,也不允许重写,因为静态方法可用于父类以及子类的所有实例。

public class Animal {     final void move() { } }

重写的目的在于根据对象的类型不同而表现出多态,而静态方法不需要创建对象就可以使用。没有了对象,重写所需要的“对象的类型”也就没有存在的意义了。

Overriding的使用规则有哪些

04、重写方法的要求

规则三:重写的方法必须有相同的参数列表。

public class Animal {     void eat(String food) { } }

Dog 类中的 eat() 方法保持了父类方法 eat() 的同一个调调,都有一个参数——String 类型的 food。

public class Dog extends Animal {     public void eat(String food) { } }

一旦子类没有按照这个规则来,比如说增加了一个参数:

public class Dog extends Animal {     public void eat(String food, int amount) { } }

这就不再是重写的范畴了,当然也不是重载的范畴,因为重载考虑的是同一个类。

规则四:重写的方法必须返回相同的类型。

父类没有返回类型:

public class Animal {     void eat(String food) { } }

子类尝试返回 String:

public class Dog extends Animal {     public String eat(String food) {         return null;     } }

于是就编译出错了(返回类型不兼容)。

Overriding的使用规则有哪些

规则五:重写的方法不能使用限制等级更严格的权限修饰符。

可以这样来理解:

  • 如果被重写的方法是 default,那么重写的方法可以是 default、protected 或者 public。

  • 如果被重写的方法是 protected,那么重写的方法只能是 protected 或者 public。

  • 如果被重写的方法是 public, 那么重写的方法就只能是 public。

举个例子,父类中的方法是 protected:

public class Animal {     protected void eat() { } }

子类中的方法可以是 public:

public class Dog extends Animal {     public void eat() { } }

如果子类中的方法用了更严格的权限修饰符,编译器就报错了。

Overriding的使用规则有哪些

规则六:重写后的方法不能抛出比父类中更高级别的异常。

举例来说,如果父类中的方法抛出的是 ioException,那么子类中重写的方法不能抛出 Exception,可以是 IOException  的子类或者不抛出任何异常。这条规则只适用于可检查的异常。

可检查(checked)异常必须在源代码中显式地进行捕获处理,不检查(unchecked)异常就是所谓的运行时异常,比如说  NullPointerException、ArrayIndexOutOfBoundsException 之类的,不会在编译器强制要求。

父类抛出 IOException:

public class Animal {     protected void eat() throws IOException { } }

子类抛出 FileNotFoundException 是可以满足重写的规则的,因为 FileNotFoundException 是 IOException  的子类。

public class Dog extends Animal {    public void eat() throws FileNotFoundException { } }

如果子类抛出了一个新的异常,并且是一个 checked 异常:

public class Dog extends Animal {    public void eat() throws FileNotFoundException, InterruptedException { } }

那编译器就会提示错误:

Error:(9, 16) java: com.itwanger.overriding.Dog中的eat()无法覆盖com.itwanger.overriding.Animal中的eat()   被覆盖的方法未抛出java.lang.InterruptedException

但如果子类抛出的是一个 unchecked 异常,那就没有冲突:

public class Dog extends Animal {    public void eat() throws FileNotFoundException, IllegalArgumentException { } }

如果子类抛出的是一个更高级别的异常:

public class Dog extends Animal {    public void eat() throws Exception { } }

编译器同样会提示错误,因为 Exception 是 IOException 的父类。

Error:(9, 16) java: com.itwanger.overriding.Dog中的eat()无法覆盖com.itwanger.overriding.Animal中的eat()   被覆盖的方法未抛出java.lang.Exception

05、如何调用被重写的方法?

规则七:可以在子类中通过 super 关键字来调用父类中被重写的方法。

子类继承父类的方法而不是重新实现是很常见的一种做法,在这种情况下,可以按照下面的形式调用父类的方法:

super.overriddenMethodName();

来看例子。

public class Animal {     protected void eat() { } }

子类重写了 eat() 方法,然后在子类的 eat() 方法中,可以在方法体的第一行通过 super.eat()  调用父类的方法,然后再增加属于自己的代码。

public class Dog extends Animal {    public void eat() {        super.eat();        // Dog-eat    } }

06、重写和构造方法

规则八:构造方法不能被重写。

因为构造方法很特殊,而且子类的构造方法不能和父类的构造方法同名(类名不同),所以构造方法和重写之间没有任何关系。

07、重写和抽象方法

规则九:如果一个类继承了抽象类,抽象类中的抽象方法必须在子类中被重写。

先来看这样一个接口类:

public interface Animal {     void move(); }

接口中的方法默认都是抽象方法,通过反编译是可以看得到的:

public interface Animal {     public abstract void move(); }

如果一个抽象类实现了 Animal 接口,move() 方法不是必须被重写的:

public abstract class AbstractDog implements Animal {     protected abstract void bark(); }

但如果一个类继承了抽象类 AbstractDog,那么 Animal 接口中的 move() 方法和抽象类 AbstractDog 中的抽象方法  bark() 都必须被重写:

public class BullDog extends AbstractDog {       public void move() {}       protected void bark() {} }

08、重写和 synchronized 方法

规则十:synchronized 关键字对重写规则没有任何影响。

synchronized 关键字用于在多线程环境中获取和释放监听对象,因此它对重写规则没有任何影响,这就意味着 synchronized  方法可以去重写一个非同步方法。

09、重写和 strictfp 方法

规则十一:strictfp 关键字对重写规则没有任何影响。

如果你想让浮点运算更加精确,而且不会因为硬件平台的不同导致执行的结果不一致的话,可以在方法上添加 strictfp 关键字。因此 strictfp  关键和重写规则无关。

感谢各位的阅读,以上就是“Overriding的使用规则有哪些”的内容了,经过本文的学习后,相信大家对Overriding的使用规则有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Overriding的使用规则有哪些

本文链接: https://lsjlt.com/news/281239.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Overriding的使用规则有哪些
    这篇文章主要讲解了“Overriding的使用规则有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Overriding的使用规则有哪些”吧!01、什么是重写重写带来了一种非常重要的能力,...
    99+
    2023-06-15
  • CSS常用的规则有哪些
    今天小编给大家分享一下CSS常用的规则有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2024-04-02
  • java中通配符的使用规则有哪些
    本篇文章为大家展示了java中通配符的使用规则有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。说明定义in变量,使用上限通配符,使用extends关键字。用super关键字用下限通配符来定义ou...
    99+
    2023-06-20
  • CSS中@规则的用法有哪些
    CSS中@规则的用法有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。at-rule是一个声明,为CSS提供执行或怎么表现的...
    99+
    2024-04-02
  • HTML5中常用的规则有哪些
    今天小编给大家分享一下HTML5中常用的规则有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2024-04-02
  • css中@规则有哪些
    小编给大家分享一下css中@规则有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 一个at-rule就是一个CSS语句,...
    99+
    2024-04-02
  • 正则表达式常用规则有哪些
    这篇文章将为大家详细讲解有关正则表达式常用规则有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我们来看一下正则常用规则:一张图足以说明一切,哈哈哈!!方法:find()查找findall()查找所有内...
    99+
    2023-06-20
  • css常用的命名规则有哪些
    这篇文章主要讲解了“css常用的命名规则有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css常用的命名规则有哪些”吧!一、常用命名规则头:header...
    99+
    2024-04-02
  • css命名的规则有哪些
    本篇内容介绍了“css命名的规则有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 头:header ...
    99+
    2024-04-02
  • Java的FE潜规则有哪些
    今天小编给大家分享一下Java的FE潜规则有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 首先是最简单的select...
    99+
    2023-06-17
  • python的切片规则有哪些
    在Python中,切片操作用于从一个序列(如字符串、列表、元组)中获取子序列。切片规则如下:1. 基本切片规则:使用[start:s...
    99+
    2023-09-26
    python
  • oracle19c版本的规则有哪些
    Oracle 19c版本的规则包括以下几个方面:1. 数据完整性规则:包括主键约束、唯一约束、外键约束、非空约束等,用于确保数据的完...
    99+
    2023-09-09
    oracle
  • MongoDB的查询规则有哪些
    MongoDB的查询规则包括以下几个方面: 精确匹配查询:使用等于($eq)操作符来匹配指定字段的值。 比较查询:使用比较操...
    99+
    2023-10-25
    mongodb
  • NASA的编码规则有哪些
    这篇文章主要介绍了NASA的编码规则有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。#1.避免使用复杂的流程构造,例如Goto和递归recursion如果不需要执行简单任...
    99+
    2023-06-03
  • pgsql的更新规则有哪些
    UPDATE语句:使用UPDATE语句来更新表中的数据,指定要更新的列和新的值。 约束:可以通过定义约束(如主键、唯一约束、...
    99+
    2024-03-01
    pgsql
  • access的排序规则有哪些
    按照时间顺序:即按照最近的访问时间进行排序,先访问的排在前面,后访问的排在后面。 按照访问频率:即按照被访问的次数进行排序,被访问...
    99+
    2024-03-15
    access
  • css规则的类型有哪些
    css 规则包括:通用规则:选择所有元素类型选择器:根据元素类型选择元素类选择器:根据元素的 class 属性选择元素id 选择器:根据元素的 id 属性选择元素(唯一)后代选择器:选择...
    99+
    2024-04-25
    css 作用域
  • Mysql中复合索引使用规则有哪些
    这篇文章主要介绍了Mysql中复合索引使用规则有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 联合索引验证:从左向右发挥作用索引:(...
    99+
    2024-04-02
  • CSS通用命名规则有哪些
    这期内容当中小编将会给大家带来有关CSS通用命名规则有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。CSS规范化命名三种通用命名规则骆驼式命名法:正如它的名称所表示的...
    99+
    2024-04-02
  • JavaScript函数调用规则有哪些
    本篇文章给大家分享的是有关JavaScript函数调用规则有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。JavaScript函数调用规则...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作