`

覆盖VS重载(override VS overload)

阅读更多
覆盖VS重载

初次见到这两个单词并没有什么特别的感觉,但是时间长了,却发现书上一会儿用

override,一会儿又用overload,搞得我的迷迷糊。于是就做了个总结,希望能对和我

一样对这两个概念模糊不清的网友有一个帮助。
override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以

求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只

是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典

型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的

几点:
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其

进行覆盖。

overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相

同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同

的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数

,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun

(int, float), 但是不能为fun(int, int));
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对

其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

下面是对override和overload的测试程序,其中注释中的内容都是会产生编译错误的代

码,我们将注释去掉,看看在编译时会产生什么效果。
// 对overload测试的文件:OverloadTest.java

public class OverloadTest {
// 下面几个方法用来验证可以通过定义不同的参数类型和参数的数目进行方法重载。
public void fun(){
System.out.println("method fun in OverloadTest, no parameter");
}


public void fun(float f) {
System.out.println("method fun in OverloadTest, parameter type: float");
}


public void fun(int i){
System.out.println("method fun in OverloadTest, parameter type: int");
}


public void fun(int i1, int i2) {
System.out.println("method fun in OverloadTest, parameter type: int, int");
}


// 下面的两个方法用来验证可以通过定义不同的参数顺序进行方法重载。
// 需要注意:这里的参数肯定不是相同的类型,否则的顺序的先后就毫无意义。
public void fun1(int i, float f) {
System.out.println("method fun1 in OverloadTest, sequence of parameters is:

int, float");
}


public void fun1(float f, int i) {
System.out.println("method fun1 in OverloadTest, sequence of parameters is:

float, int");
}


// 下面的两个方法用来验证方法抛出的异常对于重载的影响.
// 无论是异常的类型还是异常的个数都不会对重载造成任何的影响。
public void fun2() throws TestException {
System.out.println("fun2 in OverloadTest, exception: TestException");
}

public void fun2(int i) throws TestException, TestException1 {
System.out.println("fun2 in OverloadTest, exception: TestException,

TestException1");
}


public void fun2(float f) throws Exception {
System.out.println("fun2 in OverloadTest, exception: Exception");
}


// 不能通过抛出的异常类型来重载fun方法。
//public void fun(int i) throws Exception {
// System.out.println("method fun in OverloadTest, parameter type: int,

exception: Exception");
//}

// 不能通过返回值重载fun方法。
//public boolean fun(int i) throws Exception {
// System.out.println("method fun in OverloadTest, parameter type: int,

exception: Exception, return: boolean");
// return true;
//}


private void fun3() { }

// 不能通过不同的访问权限进行重载
public void fun3() { }

public static void main(String[] args) {
// 这里只是定义了OverloadTest的实例,所以test不会调用
// OverloadTest1中的方法。
OverloadTest test = new OverloadTest1();
// 这里定义了OverloadTest1的实例,因为OverloadTest1是OverloadTest
// 的子类,所以test1会调用OverloadTest中的方法。
OverloadTest1 test1 = new OverloadTest1();

try {
int i = 1, j = 2, m = 3;

// 这里不会调用OverloadTest1的fun方法
// test.fun(i, m, j);
test1.fun(i, j, m);
test1.fun();
// 这个调用不会执行,因为fun3()在OverloadTest中访问权限是priavte
//test1.fun3();
test1.fun3(i);
} catch(Exception e) { }
}
}

class OverloadTest1 extends OverloadTest{
// 在子类中重载fun
public void fun(int i, int m, int n) {
System.out.println("Overload fun1 in OverloadTest1, parameter type: int,

int, int");
}

// 这个不是对父类中方法的重载,只是一个新的方法。
public void fun3(int i) {
System.out.println("fun2 in OverloadTest1");
}
}

// 对override测试的文件:OverrideTest.java
public class OverrideTest {
public void fun() throws TestException {
System.out.println("method fun in OverrideTest");
}

private void fun1() {
System.out.println("method fun1 in OverrideTest");
}

public static void main(String[] args) {
OverrideTest test = new OverrideTest1();
try {
test.fun();
test.fun1();
} catch(Exception e) { }
}
}

class OverrideTest1 extends OverrideTest{
// 以下正常Override
public void fun() throws TestException2 {
System.out.println("fun in OverrideTest1");
}

// 不能Override父类中的方法,因为它定义了不同的异常类型和
// 返回值。
//public int fun() throws TestException1 {
// System.out.println("method fun in Test");
// return 1;
//}

// 不能Override父类中的方法,因为它抛出了比父类中非法范围
// 更大的异常。
//public void fun() throws Exception {
// System.out.println("fun in OverrideTest1");
//}

// 这个方法并没有Override父类中的fun1方法,因为这个方法在
// 父类是private类型,所以这里只是相当于定义了一个新方法。
public void fun1() {
System.out.println("method fun1 in Test");
}
}

class TestException extends Exception{
public TestException(String msg) {
super(msg);
}
}

class TestException1 extends TestException {
public TestException1(String msg) {
super(msg);
}
}

class TestException2 extends TestException {
public TestException2(String msg) {
super(msg);
}
}

 
分享到:
评论

相关推荐

    Override-Overload

    在面向对象编程中,方法重写(Override)和方法重载(Overload)是两个非常重要的概念。它们虽然都涉及到方法名称的重复使用,但是其本质含义、作用以及应用场景有着明显的区别。 #### 一、Override(方法重写) *...

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

    在C#编程语言中,重写(Override)和重载(Overload)是两种非常重要的概念,它们分别涉及对象多态性和方法的可选性。理解这两者的区别对于编写高效且易于维护的代码至关重要。 首先,让我们深入了解一下重写(Override)...

    overload and override

    在面向对象编程中,尤其是在Java语言中,`Overload`(重载)和`Override`(重写)是两个非常重要的概念,它们帮助开发者更好地组织代码并提高代码的复用性和灵活性。 #### 二、Overload(重载) **定义**: - `...

    overload and override.txt的区别

    在面向对象编程中,`overload`(重载)与`override`(重写或覆盖)是两个重要的概念。它们虽然只有一字之差,但在实际应用中却有着本质的区别。 #### Overload(重载) 重载指的是在一个类中定义多个同名但参数...

    Java 重写(Override)与重载(Overload).pdf

    根据提供的文件信息,我们可以深入探讨Java中的两个核心概念:重写(Override)与重载(Overload)。这两个概念在面向对象编程中非常重要,尤其是在Java这样的语言中。 ### Java中的重写(Override) #### 什么是重写? ...

    Java重写(Override)&重载(Overload).pdf

    Java中的重写(Override)和重载(Overload)是面向对象编程中的两个核心概念,它们都是为了提高代码的灵活性和可复用性。 **重写(Override)** 是指子类能够重新定义父类中非私有(public或protected)的方法,以便在...

    PHP和JAVA中的重载(overload)和覆盖(override) 介绍

    重载(Overload)和覆盖(Override)是面向对象编程中的两个重要概念,它们在PHP和Java等编程语言中有着不同的应用和规则。 **重载(Overload)** 重载通常发生在同一类内部,指的是可以有多个同名方法,但这些方法的...

    override和重载的区别

    总结一下,"重载"(Overload)和"覆盖"(Override)的主要区别在于: 1. 重载发生在同一类中,而覆盖发生在子类对父类的继承关系中。 2. 重载关注方法的签名(包括名称和参数列表),允许返回类型不同;而覆盖要求...

    Java语言中的 覆盖重载和多态

    Java语言中的覆盖(Override)和重载(Overload)以及多态(Polymorphism)是面向对象编程的重要概念,它们是实现代码复用和灵活性的关键。 **多态性(Polymorphism)** 多态性是Java中一种允许一个接口有多种实现的方式。...

    C++中Overload,Override,Hide之间的区别

    在C++编程语言中,Overload(重载)、Override(覆盖)和Hide(隐藏)是三个重要的概念,它们涉及到函数的多态性、继承和作用域。这些特性使得C++能够实现灵活的代码复用和面向对象的设计。 **1. Overload(重载)*...

    override和重载 希望对大家有帮助

    在编程语言中,`override` 和 `重载(Overload)` 是两个非常重要的概念,它们分别涉及面向对象的多态性和方法的灵活性。这两个概念在Java、C#等面向对象的语言中尤为常见,但理解它们的含义和用法对于任何程序员来说...

    C#中的重载与覆盖例子

    在C#编程语言中,重载(Overload)与覆盖(Override)是两种非常重要的多态性实现方式。本文将通过一个具体的示例来详细解释这两种概念,并探讨它们在实际编程中的应用。 #### 一、重载(Overload) 重载是指在同一...

    JAVA的重载和覆盖(论文)

    JAVA中的重载(Overload)和覆盖(Override)是面向对象编程中两个核心概念,尤其在多态性的体现上扮演着重要角色。这两者虽然在名称上相似,但在实际应用和概念理解上有着本质的区别。 ### 重载(Overload) 重载是在同...

    Java重写(Override)与重载(Overload)区别原理解析

    Java重写(Override)与重载(Overload)区别原理解析 Java 编程语言中有两个重要的概念:重写(Override)和重载(Overload)。这两个概念经常被混淆,但它们具有不同的作用和特点。本文将详细地介绍 Java 中的重写和...

    C++中overload,override,overwrite的区别详细解析

    Overload(重载):在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型、顺序不同),即函数重载。(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;...

    Java overload和override的区别分析

    Java中的方法重载(Overloading)和重写(Overriding)是两个重要的概念,它们都是实现多态性的方式,但有着本质的区别。 1. **方法重载(Overloading)**: 方法重载是指在同一个类中可以有多个同名方法,但这些方法的...

    delphi动态虚拟覆盖重载重定义的区别

    方法重载(Overload)是另一个关键概念,它允许在同一作用域内使用相同的函数名,但参数列表不同。这使得程序员可以为不同数据类型提供相同功能的函数,而无需为每种类型创建不同的函数名称。在 DELPHI 中,通过重载...

    java 重载(overload)与重写(override)详解及实例

    Java中的重载(Overload)和重写(Override)是两个重要的面向对象概念,它们都是实现多态的方式,但有着本质的区别。 **重载(Overload)** 重载发生在同一类或具有继承关系的类中,它允许创建多个同名方法,但这些方法...

Global site tag (gtag.js) - Google Analytics