方法重载和覆盖有啥区别? [复制]
Posted
技术标签:
【中文标题】方法重载和覆盖有啥区别? [复制]【英文标题】:What is the difference between method overloading and overriding? [duplicate]方法重载和覆盖有什么区别? [复制] 【发布时间】:2012-09-04 15:50:43 【问题描述】:重载方法和覆盖方法有什么区别?谁能举例说明一下?
【问题讨论】:
【参考方案1】:方法重载处理在同一个类中有两个或多个方法具有相同名称但不同参数的概念。
void foo(int a)
void foo(int a, float b)
方法覆盖意味着有两个方法具有相同的参数,但不同的实现。其中一个将存在于父类中,而另一个将存在于派生类或子类中。 @Override
注解虽然不是必需的,但可以在编译时对 enforce proper overriding of a method 有所帮助。
class Parent
void foo(double d)
// do something
class Child extends Parent
@Override
void foo(double d)
// this method is overridden.
【讨论】:
@Override
不是必需的。这是一个很好的做法,但不是必需的。
对不起@GriffeyDog。你是对的“@Override”不是强制性的。但是要记住你正在覆盖一个方法,这是一个很好的做法..谢谢提醒..
重载不需要在同一个类中,也可以在父类和派生类之间进行。
回复@happs 的评论:如果父类定义了一个签名,而派生类定义了第二个签名,则仍然是重载,根据JLS§8.4.9:“如果一个类的两个方法(无论是两者都在同一个类中声明,或者都由一个类继承,或者一个声明一个继承)具有相同的名称但签名不是覆盖等效的,则称该方法名称是重载的。”
【参考方案2】:
方法覆盖是指子类使用相同的参数重新定义与父类相同的方法。 例如,标准 Java 类 java.util.LinkedHashSet
扩展了 java.util.HashSet
。方法add()
在LinkedHashSet
中被覆盖。如果您有一个HashSet
类型的变量,并且您调用它的add()
方法,它将根据它是HashSet
还是LinkedHashSet
来调用add()
的适当实现。这称为多态性。
方法重载是在同一个类中定义多个方法,它们接受不同数量和类型的参数。在这种情况下,调用的实际方法是在编译时根据参数的数量和类型决定的。 例如,方法System.out.println()
被重载了,所以你可以传递整数和字符串,它会调用不同版本的方法。
【讨论】:
如果你有一个子类定义了相同的方法但参数不同,那么这是否被认为是覆盖和重载? 那么它只是重载,因为它没有覆盖任何父方法。以上是关于方法重载和覆盖有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
请问重载overload,覆盖override,重写overwrite,这三者之间有啥区别呢?