Java 中 override 和 overload 的去别人

问题出现:

  即使对于一个经验丰富的开发人员来说,方法重载和方法覆盖的区别都能让他犹豫一下, 对于新手来说,经常容易弄混淆。

  有没有比较深入浅出的理解方式,能让人过目不忘,用起来还能有条件反射般的速度呢?

其他人是怎么做的:

  写类似比较的博客非常之多,无非也就是分开介绍,然后比较区别。

  好像也有效果,前提是要理解,完了还要不时拿来复习,保持记忆不被遗忘。

可以这样理解:

  override 更准确的翻译应该是推翻,重写。

  overload 更准确的翻译应该是过载。

  如果你不是新手,看到这个解释的时候应该有点茅塞顿开的感觉,

  因为直译之后的意思就是这两个方式的功能概括。

  所以:

  override 个人喜欢叫做方法重写;

  overload 个人喜欢叫做方法过载。

分析:

  为什么叫方法重写:

    1.父类中的方法满足不了需要,子类可以推翻父类中的方法。
    2.同样的方法名称,参数列表,返回类型,抛出的异常(或者是父类抛出的异常的子类),子类重写一个。
    3.所以方法重写要求很严格,除了方法体内部的实现和访问权限,其他的都要和父类中需要被重写的方法保持一致。
    有一点要特别注意,方法重写之后访问权限可以不同:

      可以扩大访问权限,但是不能降低访问权限。

      可以看作是对子类的兼容性和拓展性要求的折衷妥协吧。

    注意:被重写的方法访问权限不能为 private,因为 private 修饰的方法子类没有访问权限,更不要提重写。

  为什么叫方法过载:

    1.过载指的是应对不同的参数列表而产生的方法过载。
    2.所以方法过载要求方法名称必须相同,参数列表必须不同;
    3.访问权限,返回类型,抛出的异常之类的可以相同也可以不同。

      使用方法过载的目的,根据调用时的实参表与形参表,来选择对应的方法体的。

    注意:如果某一方法在父类中是访问权限是 private,那么就不能在子类对其进行重载;
    如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

练习一下:

class A {
 protected int method1(int a, int b) { return 0; }
}

public class B extends A{
 public int method1(int a, int b) { return 0; }
 // private int method1(int a, int b) { return 0; }
 // private long method1(int a, int b) { return 0; }
 public short method1(int a, long b) { return 0; }
 private int method1(int a, long b) { return 0; }
}

(参考答案预警!你不打算在心里演算一下么?)

参考答案:

class A {
 protected int method1(int a, int b) { return 0; }
}

public class B extends A{
 public int method1(int a, int b) { return 0; } // 正确,重写父类方法,可以扩大访问权限
 // private int method1(int a, int b) { return 0; } // 错误,重写父类方法,不能降低了访问权限
 // private long method1(int a, int b) { return 0; } // 错误,重写父类方法,不能改变返回值类型
 public short method1(int a, long b) { return 0; } // 正确,method1 方法参数过载,可以有不同的访问权限和返回值类型
 private int method1(int a, long b) { return 0; }/ /正确,method1 方法参数过载,可以有不同的访问权限和返回值类型
}

小结:

override 方法重写,也叫方法覆盖;
  要求与被重写的方法:
    名称相同,
    参数列表相同,
    返回类型相同,
    抛出的异常相同(或者是父类抛出的异常的子类)。
  被重写的方法访问权限不能为 private

overload 方法过载;
  要求过载的方法:
    方法名称必须相同;
    参数列表必须不同;
    访问权限,返回类型,抛出的异常可以相同也可以不同。

传送门:https://blog.51cto.com/13508140/2339876
本文系笔者原创
转载请注明出处
—————————————

原文地址:https://www.cnblogs.com/ryelqy/p/10916437.html

时间: 2024-08-29 22:13:45

Java 中 override 和 overload 的去别人的相关文章

java中Override 和 Overload的区别

override(重写)  1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常). 4.存在于父类和子类之间. 5.方法被定义为final不能被重写. overload(重载) 1.参数类型.个数.顺序至少有一个不相同. 2.不能重载只有返回值不同的方法名. 3.存在于父类和子类.同类中.

C#中override和overload的区别

重载应该叫overload,重写叫override:重载某个方法是在同一个类中发生的!重写是在子类中重写父类中的方法. 1.override:   父类:public virtual string ToString(){return "a";}                   子类:public override string ToString(){return "b";}2.overload:  同一类中或父子关系类中皆可.                  

Java中 @override 报错

报错问题: 在我们导入别人的项目的时候有可能会出现Java类报错,点击错误时提示让我们remove掉@override.这是JDK版本的问题导致的跟源码无关. 解决方法: 方案1.直接删除掉报错的@override注解:这是最笨的方法,虽然这样直接remover掉没啥大问题,如果注解的地方比较多怎么办?所以这样不能从根本上解决问题.(不建议) 方案2.修改项目的JDK版本: @override注解在JDK1.5就出现了,在1.5的版本时@override是无法支持在接口的实现上.而在JDK1.6

c#中 override 和overload 的区别

重载应该叫overload,重写叫override:重载某个方法是在同一个类中发生的!重写是在子类中重写父类中的方法. 1.override:   父类:public virtual string ToString(){return "a";}                   子类:public override string ToString(){return "b";}2.overload:  同一类中或父子关系类中皆可.                  

Java中@Override的作用

@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1.可以当注释用,方便阅读:2.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.例如,你如果没写@Override,而你下面的方法名又写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法. 举例:在重写父类的onCreate时,在方法前面加上@Override 系统可以帮你检查方法的正确性.@Overridepublic void onCreat

java中变量使用的总结

java中整数默认为int,小数默认为double. float n5=1.3; 这个句子就会报错,应该修改成这样float n5=1.3f; 八大基本类型 变量类型 位数 范围 备注 Byte 8位 -27-------27-1 带符号整数 Short 16位 -215-------215-1 带符号整数 Int 32位 -231-------231-1 带符号整数 Long 64位 -263------263-1 带符号整数 Char 16位 0-----216-1 无符号整数 Float

delphi override、overload、reintroduce的区别-0613.txt

http://blog.csdn.net/honglixx/article/details/3624934 1.override overload reintroduce的中文叫法是什么? override:覆盖:overload:重载:Reintroduce:重定义 2.在子类中override或overload父类中的动态或虚拟方法后是否会改变父类中的相应方法? 不会 3.self是怎么回事,怎么使用? Self因为这这个对象本身,例如,在TForm1的OnCreate事件中写Self指的是

Java中的Overload(重载)与Override(重写、覆盖)

java中的方法重载发生在同一个类中两个或者多个方法的方法名相同但是参数不同的情况,方法重载是指子类与父类之间子类重新定义了父类的方法,重写的方法与原方法签名.返回值.参数完全相同.Overload(重载) 重载Overload是一个类中多态性的一种表现,是编译时的多态性.方法重载是让类以统一的方式处理不同类型数据的一种手段.重载发生在同一个类中.同名的方法如果有不同的参数列表(参数个数.类型)则视为重载. java方法的重载,就是可以在类中创建多个方法,这些方法具有相同的名字,但具有不同的参数

java中的重载(overload)和重写(override)区别

方法重载(overload): 方法重载就是在一个类中可以创建多个方法,它们具有相同的名字,但是具有不同的参数和不同定义,调用方法时通过传递给他们的不同参数个数和参数列表决定具体使用     哪        个方法,这就是多态性,重载的时候方法名一样,参数类型和个数不一样,返回值烈性可以相同可以不同,可以有不同的访问修饰符,可以抛出不同的异常. 例子: package com.test.entity; public class Dog { Dog() { this.bark(); } void