重载overload和重写override的区别

public class MethodOverrideVSOverload {
	//因为参数与Object的equals方法不同,故没有重写equals方法,而是重载关系
	public boolean equals(MethodOverrideVSOverload other) {
		System.out.println("MethodOverrideVSOverload");
		return true;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//编译期o1和o2都是Object对象,故调用的还是Object的equals方法
		Object o1=new MethodOverrideVSOverload();
		Object o2=new MethodOverrideVSOverload();
		//编译期o3,o4是MethodOverrideVSOverload,故调用的是MethodOverrideVSOverload
		//的equals方法,重载发生在编译期,重写发生在运行期。
		MethodOverrideVSOverload o3=new MethodOverrideVSOverload();
		MethodOverrideVSOverload o4=new MethodOverrideVSOverload();
		if(o1.equals(o2)) {
			System.out.println("Object o1 and o2 is equal.");
		}
		if(o3.equals(o4)) {
			System.out.println("Object o3 and o4 is equal.");
		}
	}

}

结果输出是:

 MethodOverrideVSOverload

 Object o3 and o4 is equal.

为什么会这样呢?

 首先要搞清楚重载和重写的关系。

 重载指的是同一个类中,方法名相同但形参列表不同,重载是编译时静态绑定的。

 重写则是指,子类覆盖父类的同名方法,重写是运行时动态绑定的。

 对于子类重写的要求如下:

   参数列表,返回值(可以是子类)均不可变。

   可以抛出更少的异常,但不可抛出父类未声明的异常。

   访问权限比起父类要更宽松。

   运行时根据对象类型来决定调用的方法。

 看回程序,public boolean equals()方法看起来是跟Object的equals方法有点像,实际上形参不一样,所以这里应该是方法重载而不是重写。

 o1,o2实际上是调用了Object的equals方法,因为他们的编译时类型是Object,而o3,o4则是调用MethodOverrideVsOverload的方法。

 怎样解决这个问题呢?

 使用一个Annotation来进行说明,@Override,当用了这个Annotation时,因为形参列表不一样,则会报错。

@Override
public boolean equals(Object other) {
		System.out.println("MethodOverrideVSOverload");
		return true;
}

 这时候的结果是:

  MethodOverrideVSOverload
  Object o1 and o2 is equal.
  MethodOverrideVSOverload
  Object o3 and o4 is equal.

 

时间: 2024-10-12 21:47:41

重载overload和重写override的区别的相关文章

Java重载(overload)和重写(override)

重载overload 针对:类中已有的方法 重载条件: 相同的方法名,不同的参数列表[不同的参数列表包括参数的类型,参数的顺序] 不构成重载: 不同的访问权限 不同的返回值 抛出异常 不同的异常个数 使用泛型作为参数,由于泛型会在编译时进行类型擦除,泛型有时会被认为是相同的参数列表.如List<String> 和List<Integer>擦除后均是List<Object> 重写override 针对:类中继承自父类的方法 重写条件: 不小于父类的访问权限 相同的返回值

重载(overload)、覆盖(override)、隐藏(hide)的区别

这三个概念都是与OO中的多态有关系的.如果单是区别重载与覆盖这两个概念是比较容易的,但是隐藏这一概念却使问题变得有点复杂了,下面说说它们的区别吧. 重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同.调用的时候根据函数的参数来区别不同的函数. 覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现.即函数名和参数都一样,只是函数的实现体不一样. 隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了.隐藏与另外两个概念表面上看来很像,很难区分,其实他们的关键区别就

JAVA中继承时方法的重载(overload)与重写/覆写(override)

JAVA继承时方法的重载(overload)与重写/覆写(override) 重载-Override 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就说两个函数是重载函数,而至于返回值是否一样,没关系.同时,重载可以发生在同一个类中也可以发生在继承关系中. class A { } class B extends A { public void fun(String data1) { System.out.println(data1); } pub

重载(overload)、覆盖(override)和隐藏(hide)

写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide).在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的,他们是英语专业的),常常把重载(overload)和覆盖(override)搞错! 我们先来看一些代码及其编译结果. 实例一: #include "stdafx.h" #include <iostream.h> class CB { public: void f(int) {

C++中重载(overload)、重写(override,也叫做“覆盖”)和重定义(redefine)的区别?

1)重载(overload): 指函数名相同,但是它的参数表列个数或顺序,类型不同.但是不能靠返回类型来判断. a 相同的范围(在同一个类中) b 函数名字相同. 参数不同 c virtual关键字可有可无 d 返回值可以不同: 2) 重写(覆盖override)是指派生类函数覆盖基类函数,特征是: a 不同的范围,分别位于基类和派生类中 b 函数的名字相同. 参数相同 c 基类函数必须有virtual关键字,不能有static d 返回值相同(或者协变),否则报错: e 重写函数的访问修饰符可

重写(overwrite)、重载(overload)和覆盖(override)三者之间的区别

覆盖:子类继承了父类的同名无参函数.当子类从父类继承了一个无参函数,而又定义了一个同样的无参函数,则子类定义的方法覆盖父类的方法,称为覆盖. 重载:子类继承了父类的同名有参函数.当子类继承了父类的一个同名方法,且方法参数不同,称为重载.通过方法的重载,子类可以重新实现父类的某些方法,使其具有自己的特征. 重写:当前类的同名方法.通过方法的重写,一个类可以有多个具有相同名字的方法,由传递给它们不同的个数和类型的参数来决定使用哪种方法.因此,重写的名称是当前类中的同名函数,不是父类中的函数名.

JAVA重载(overload)和覆盖(override)中你所不知道的陷阱

大家都知道重载是指在同一个类中,定义了有相同名称但是有不同参数类型的方法时,到底调用那一个方法会根据参数类型来选择.我们来看下面这个例子: public class ParentClass { } public class ChildClass extends ParentClass{ } public class Test { public void testOverLoad(ParentClass cls){ System.out.println("It's ParentClass"

c# 中面相对性的三个特点:封装,继承,多态, 以及c#中隐藏(new)和方法重写(override)和重载(overload)的区别

封装 1)封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问,通常有两种访问方式:set 设置,get 获取. 2)封装结果:存在但是不可见. 3) 访问修饰符 声明的可访问性                                 含义 public                                    访问不受限制. protected                              访问仅限于本类或者其子类(可以跨程序集). p

重写(Override)与重载(Overload)区别

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法. 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常.例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常