iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >在Java中使用重写时需要遵循哪些规则
  • 704
分享到

在Java中使用重写时需要遵循哪些规则

2023-06-14 09:06:47 704人浏览 八月长安
摘要

在Java中使用重写时需要遵循哪些规则?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。01、什么是重写?重写带来了一种非常重要的能力,可以让子类重新实现从超类那继

在Java中使用重写时需要遵循哪些规则?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

01、什么是重写?

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

在Java中使用重写时需要遵循哪些规则

重写的方法和被重写的方法,不仅方法名相同,参数也相同,只不过,方法体有所不同。

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 的,所以子类在尝试重写该方法的时候就出现编译错误了!

在Java中使用重写时需要遵循哪些规则

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

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

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

在Java中使用重写时需要遵循哪些规则

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;  }}

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

在Java中使用重写时需要遵循哪些规则

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

可以这样来理解:

  • 如果被重写的方法是 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() { }}

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

在Java中使用重写时需要遵循哪些规则

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

举例来说,如果父类中的方法抛出的是 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 关键和重写规则无关。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 在Java中使用重写时需要遵循哪些规则

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 在Java中使用重写时需要遵循哪些规则
    在Java中使用重写时需要遵循哪些规则?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。01、什么是重写?重写带来了一种非常重要的能力,可以让子类重新实现从超类那继...
    99+
    2023-06-14
  • 建设企业网站时需要遵循哪些规律
    这篇文章给大家介绍建设企业网站时需要遵循哪些规律,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。第一规律、明确企业网站所针对的用户群:第一步要了解的就是自己网站的用户定位,产品的用户定位。不要网站做了半年,或在公司呆了几...
    99+
    2023-06-07
  • 在css中有哪些规则需要注意的
    小编给大家分享一下在css中有哪些规则需要注意的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在css中,属性与其属性之间需要使用英文的":"...
    99+
    2023-06-14
  • 在java中使用subList时需要注意哪些问题
    在java中使用subList时需要注意哪些问题?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 使用Arrays.asList的注意事项1.1 可能会踩的坑先来看下Ar...
    99+
    2023-06-06
  • 在java中使用static时需要注意哪些问题
    在java中使用static时需要注意哪些问题?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、使用static方法的时候,只能访问static声明的属性和方法,而非stati...
    99+
    2023-06-06
  • 在java中使用final时需要注意哪些事项
    在java中使用final时需要注意哪些事项?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表...
    99+
    2023-06-14
  • 在java中使用Sorted时需要注意哪些问题
    这期内容当中小编将会给大家带来有关在java中使用Sorted时需要注意哪些问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用...
    99+
    2023-06-14
  • 在java中使用变量时需要注意哪些事项
    本篇文章为大家展示了在java中使用变量时需要注意哪些事项,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、说明每个变量都有类型,类型可以是基本类型,也可以是引用类型。变量名必须是合法的标识符。变量...
    99+
    2023-06-15
  • 在java 中使用this关键字时需要注意哪些事项
    本篇文章给大家分享的是有关在java 中使用this关键字时需要注意哪些事项,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。常用的java框架有哪些1.SpringMVC,Spr...
    99+
    2023-06-14
  • 在java中使用泛型方法时需要注意哪些问题
    这篇文章给大家介绍在java中使用泛型方法时需要注意哪些问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网...
    99+
    2023-06-14
  • 在python中使用lxml时需要注意哪些事项
    这篇文章将为大家详细讲解有关在python中使用lxml时需要注意哪些事项,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python主要应用领域有哪些1、云计算,典型应用OpenStack。...
    99+
    2023-06-14
  • 在python中使用yield时需要注意哪些事项
    在python中使用yield时需要注意哪些事项?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比...
    99+
    2023-06-14
  • 在python中使用os.remove()时需要注意哪些问题
    在python中使用os.remove()时需要注意哪些问题?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python可以做什么Python是一种编程语言,内置...
    99+
    2023-06-14
  • 在Java8中使用Stream时需要注意哪些事项
    在Java8中使用Stream时需要注意哪些事项?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Stream简介Stream是元素的集合,这点让Stream看起来用些类似It...
    99+
    2023-05-30
    java8 stream
  • java中通配符的使用规则有哪些
    本篇文章为大家展示了java中通配符的使用规则有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。说明定义in变量,使用上限通配符,使用extends关键字。用super关键字用下限通配符来定义ou...
    99+
    2023-06-20
  • 在 LeetCode 中使用重定向,需要注意哪些问题?
    LeetCode 是一个非常受欢迎的在线编程平台,许多程序员都在这里刷题、练习和交流。在使用 LeetCode 进行编程练习的时候,重定向是一个非常有用的工具,可以帮助我们更好地调试代码和查看程序的输出。但是,在使用重定向的时候,也有一些...
    99+
    2023-09-29
    npm leetcode 重定向
  • 在java中使用static是需要注意哪些事项
    在java中使用static是需要注意哪些事项?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数...
    99+
    2023-06-14
  • 在css中使用outline-offset时需要注意哪些问题
    今天就跟大家聊聊有关在css中使用outline-offset时需要注意哪些问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。css的选择器有哪些css的选择器可以分为三大类,即id...
    99+
    2023-06-14
  • Java编程在方法中哪些时候需要参数
    目录Java在方法中什么时候需要参数Java中类的无参,带参方法重点总结类的方法定义类的某种行为(或功能)方法的返回值(两种情况)成员变量和局部变量成员变量和局部变量的区别定义带参数...
    99+
    2024-04-02
  • 使用Java和Numpy编写算法时需要注意哪些日志问题?
    在机器学习和数据科学领域中,Java和Numpy是两种最常用的编程语言。Java是一种面向对象的编程语言,常用于大型企业级应用程序的开发,而Numpy则是一种基于Python的科学计算库,用于处理大型多维数组和矩阵运算。在使用这两种语言编...
    99+
    2023-07-26
    numpy 日志 编程算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作