iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >重载和重写的区别有哪些
  • 604
分享到

重载和重写的区别有哪些

2024-04-02 19:04:59 604人浏览 泡泡鱼
摘要

这篇文章主要介绍“重载和重写的区别有哪些”,在日常操作中,相信很多人在重载和重写的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”重载和重写的区别有哪些”的疑惑有所帮

这篇文章主要介绍“重载和重写的区别有哪些”,在日常操作中,相信很多人在重载和重写的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”重载和重写的区别有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

单一调度

class Parent {   void print(String a) { log.info("Parent - String"); }   void print(Object a) { log.info("Parent - Object"); } }   class Child extends Parent {   void print(String a) { log.info("Child - String"); }   void print(Object a) { log.info("Child - Object"); } }

下面将会打印什么?

String string = ""; Object stringstrinGobject = string;   // 打印什么? Child child = new Child(); child.print(string); child.print(stringObject);   Parent parent = new Child(); parent.print(string); parent.print(stringObject);

答案:

child.print(string);        // 打印: "Child - String" child.print(stringObject);  // 打印: "Child - Object"   parent.print(string);       // 打印: "Child - String" parent.print(stringObject); // 打印: "Child - Object"

print(string)和 parent.print(string)是 Java  面向对象程序设计的教科书示例。被调用的方法取决于实际的实例类型,而不是声明的实例类型。例如,无论你将变量定义为 Child 还是  Parent,因为实际的实例类型是 Child,都将调用 Child: : print。

第二组则更为复杂,因为都是完全相同的字符串。唯一的区别是字符串被声明为 String,而 stringObject 被声明为  Object。在处理方法参数时,重要的是参数的声明类型,而不是它的实际类型。即使实际参数类型是 String,也会调用 print (Object)

隐式重写

class Parent {   void print(Object a) { log.info("Parent - Object"); } }   class Child extends Parent {   void print(String a) { log.info("Child - String"); } }

打印什么?

String string = ""; Parent parent = new Child(); parent.print(string);

答案:

parent.print(string);  // 打印: "Parent - Object"

实际的实例类型是 Child,声明的参数类型是 String,我们确实有一个为 Child: : print  (String)定义的方法。实际上,这正是在前一个示例中调用 parent.print (string)时选择的内容。但是,这并不是在这里调用的方法。

在检查子类重写之前,Java 似乎首先选择要调用哪个方法。在这种情况下,声明的实例类型是 Parent,Parent 中唯一匹配的方法是 Parent:  : print (Object)。然后,当 Java 检查 Parent: : print  (Object)的任何潜在重写时,它没有找到任何重写,因此这就是执行的方法。

显式重写

class Parent {   void print(Object a) { log.info("Parent - Object!"); }   void print(String a) { throw new RuntimeException(); } }   class Child extends Parent {   void print(String a) { log.info("Child - String!"); } }

打印什么?

String string = ""; Parent parent = new Child(); parent.print(string);

答案:

parent.print(string);  // 打印: "Child - String!"

这个示例与前面的示例之间的唯一区别是,我们添加了一个新的 Parent: : print  (String)方法。这个方法实际上从来没有被执行过——如果它运行了,它会抛出一个异常!然而,它的存在使 Java 执行了一个不同的方法。

在计算 Parent.print (String)时,运行时现在找到一个匹配的 Parent: : print (String)方法,然后看到这个方法被  Child: : print (String)重写。

模糊参数

class Foo {   void print(Cloneable a) { log.info("I am cloneable!"); }   void print(Map a) { log.info("I am Map!"); } }

下面打印的是什么?

HashMap cloneableMap = new HashMap(); Cloneable cloneable = cloneableMap; Map map = cloneableMap;   // What gets printed? Foo foo = new Foo(); foo.print(map); foo.print(cloneable); foo.print(cloneableMap);

答案:

foo.print(map);           // 打印: "I am Map!" foo.print(cloneable);     // 打印: "I am cloneable!" foo.print(cloneableMap);  // 编译不通过

与单一调度示例类似,这里重要的是参数的声明类型,而不是实际类型。另外,如果有多个方法对于给定的参数同样有效,Java会抛出一个编译错误,并强制你指定应该调用哪个方法。

多重继承-接口

interface Father {   default void print() { log.info("I am Father!"); } }   interface Mother {   default void print() { log.info("I am Mother!"); } }   class Child implements Father, Mother {}

下面打印的是什么?

new Child().print();

与前面的示例类似,这个示例也编译不通过。具体地说,Child 的类定义本身将无法编译,因为在 Father 和 Mother  中存在冲突的缺省方法。你需要修改 Child 类指定 Child: : print 的行为。

多重继承-类和接口

class ParentClass {   void print() { log.info("I am a class!"); } }   interface ParentInterface {   default void print() { log.info("I am an interface!"); } }   class Child extends ParentClass implements ParentInterface {}

打印什么?

new Child().print();

答案:

new Child().print();  // 打印: "I am a class!"

如果类和接口之间存在继承冲突,那么类方法优先。

传递性重写

class Parent {   void print() { foo(); }   void foo() { log.info("I am Parent!"); } }   class Child extends Parent {   void foo() { log.info("I am Child!"); } }

打印什么?

new Child().print();

答案:

new Child().print();  // 打印: "I am Child!"

重写方法甚至对传递调用也会生效,阅读 Parent 类的人可能认为 Parent: : print 总是会调用 Parent: :  foo。但是如果该方法被重写,那么 Parent: : print 将调用重写后的 foo ()版本。

私有重写

class Parent {   void print() { foo(); }   private void foo() { log.info("I am Parent!"); } }   class Child extends Parent {   void foo() { log.info("I am Child!"); } }

打印什么?

new Child().print();

答案:

new Child().print();  // 打印: "I am Parent!"

除了一点不同之外,这个与前一个例子完全相同。现在将 Parent.foo()声明为 private。因此,当 Parent.print()调用  foo()时,不管子类中是否存在 foo()的其他实现,也不管调用 print()的实例的实际类型如何。

静态重写

class Parent {   static void print() { log.info("I am Parent!"); } }   class Child extends Parent {   static void print() { log.info("I am Child!"); } }

打印什么?

Child child = new Child(); Parent parent = child;   parent.print(); child.print();

答案:

parent.print(); // 打印: "I am Parent!" child.print();  // 打印: "I am Child!"

Java 不允许重写静态方法。如果在父类和子类中定义了相同的静态方法,那么实例的实际类型根本不重要。只有声明的类型用于确定调用两个方法中的哪一个。

这是使用@override注解标记所有重写方法的另一个原因。在上面的例子中,在向 Child: : print  添加注解时,你会得到一个编译错误,告诉你由于方法是静态的,因此无法重写该方法。

静态链接

class Parent {   void print() { staticMethod(); instanceMethod(); }   static void staticMethod() { log.info("Parent::staticMethod"); }   void instanceMethod() { log.info("Parent::instanceMethod"); } }   class Child extends Parent {   static void staticMethod() { log.info("Child::staticMethod"); }   void instanceMethod() { log.info("Child::instanceMethod"); } }

打印什么?

Child child = new Child(); child.print();

答案:

Parent::staticMethod Child::instanceMethod

这是我们之前讨论过的一些不同概念的组合。例如,即使调用方位于父方法中,重写也会生效。但是,对于静态方法,即使变量的声明类型是 Child,也要调用  Parent: : staticMethod,因为有中间 print ()方法。

到此,关于“重载和重写的区别有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 重载和重写的区别有哪些

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

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

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

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

下载Word文档
猜你喜欢
  • 重载和重写的区别有哪些
    这篇文章主要介绍“重载和重写的区别有哪些”,在日常操作中,相信很多人在重载和重写的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”重载和重写的区别有哪些”的疑惑有所帮...
    99+
    2024-04-02
  • java中重载和重写的区别有哪些
    这篇文章主要介绍了java中重载和重写的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.重载重载指在一个类中,具有多个相同名称的方法,他们的参数列表却不相同(参数...
    99+
    2023-06-25
  • java重载与重写的区别有哪些
    本篇内容主要讲解“java重载与重写的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java重载与重写的区别有哪些”吧!区别:1、重载实现的是编译时的多态性,而重写实现的是运行时的多态...
    99+
    2023-07-04
  • java方法的重写和重载有什么区别
    Java方法的重写(Override)和重载(Overload)是两个不同的概念。重写是指在子类中重新定义父类中已有的方法,方法名、...
    99+
    2023-08-11
    java
  • 浅谈java中的重载和重写的区别
    目录1.重载小结:2.重写小结:总结1.重载 重载指在一个类中,具有多个相同名称的方法,他们的参数列表却不相同 (参数类型不同、参数个数不同甚至是参数顺序不同) 重载对返回类型没有要...
    99+
    2024-04-02
  • C++ 函数重载与重写有何区别?
    c++++ 函数重载与重写:重载:同名函数具有不同的参数类型或数量,编译时选择合适版本。重写:派生类中与基类同名函数,覆盖基类实现,提供派生类特定实现。重载特征:参数类型或数量不同,编译...
    99+
    2024-04-13
    c++ 函数重载 函数重写 作用域
  • Java方法重载和方法重写的区别到底在哪?
    方法重载和方法重写的区别 方法重载 方法重载的主要是在一个类当中,方法的方法名相同,参数列表不同,返回值类型可以相同,也可以不同. public class Demo{ pu...
    99+
    2024-04-02
  • java重构和重载有什么区别
    Java的重构(refactoring)和重载(overloading)是两个不同的概念。1. 重构是指对现有代码的修改,以改善代码...
    99+
    2023-08-30
    java
  • Java中方法重写与重载的区别
    目录一、重写(Override)二、重载(Overload)三、总结Java方法重写(Override)与重载(Overload)的区别(超详细) 首页在我们要学习这个知识点之前,应...
    99+
    2024-04-02
  • C#中重写及覆盖的区别有哪些
    这篇文章主要介绍了C#中重写及覆盖的区别有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中重写及覆盖的区别有哪些文章都会有所收获,下面我们一起来看看吧。1. 重写和覆盖的定义1.1 重写(overrid...
    99+
    2023-07-05
  • Java中方法重写和方法重载的6个区别
    一、定义 方法重载(Overloading):在同一个类中,方法名相同但参数类型、参数个数不同的方法之间的关系。 方法重写(Overriding):在子类中,有相同的方法名、参数类型、参数个数并且返回类型兼容的方法称之为...
    99+
    2023-10-29
    方法 重写 区别
  • win10重置系统和重做系统的区别有哪些
    这篇文章给大家分享的是有关win10重置系统和重做系统的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Win10重置和重装系统有什么区别由于重置此电脑和重装系统功能类似,但两者还是存在着区别。首先,重置...
    99+
    2023-06-10
  • C++深入探究重载重写覆盖的区别
    目录基类实现子类实现函数调用总结资源链接基类实现 我们先实现一个基类 class BaseTest { private: virtual void display() { c...
    99+
    2022-11-13
    C++ 重载 C++ 重写 C++ 覆盖
  • C#中隐藏、重写、重载的区别是什么
    这篇文章主要讲解了“C#中隐藏、重写、重载的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中隐藏、重写、重载的区别是什么”吧!C#重载、C#重写和C#隐藏的定义C#重载:同一个...
    99+
    2023-06-17
  • 详解Java中方法重写和方法重载的6个区别
    目录1.方法重写1.1 基本用法1.2 使用场景1.3 注意事项2.方法重载2.1 基本使用2.2 使用场景2.3 注意事项3.方法重写 VS 方法重载总结方法重写(Override...
    99+
    2024-04-02
  • Java中方法与方法重载的区别有哪些
    本篇文章给大家分享的是有关Java中方法与方法重载的区别有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。方法:Java的方法类似与其他语言的函数,是一段用来完成特定功能的代...
    99+
    2023-05-31
    java 方法重载 ava
  • 重写、覆盖、重载、多态区别是什么
    今天小编给大家分享一下重写、覆盖、重载、多态区别是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。override->...
    99+
    2023-06-27
  • java覆盖和重写有什么区别
    在Java中,覆盖(Overriding)和重写(Overloading)是指子类对父类中的方法进行重新实现的过程。它们的区别如下:...
    99+
    2023-10-18
    java
  • java覆盖和重载有什么区别
    Java中的覆盖(Override)和重载(Overload)是两个不同的概念。覆盖是指子类重新定义了父类的方法,使得子类的方法与父...
    99+
    2023-08-21
    java
  • HTML与XHTML的重要区别有哪些
    这篇文章主要介绍了HTML与XHTML的重要区别有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇HTML与XHTML的重要区别有哪些文章都会有所收获,下面我们一起来看看吧。...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作