`
包涵
  • 浏览: 37659 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

方法重写与方法重载的比较实例

    博客分类:
  • OOP
阅读更多
继承和多态都是面向对象程序设计的特点。使用继承可以在一个父类的基础上再创建一个子类,这个子类不但拥有父类已有的属性和方法,还可以创建属于自己的属性和方法。由于子类和父类之间的关系,从而引出了方法重写和方法重载的问题。方法重写及方法重载在继承和多态性方面的应用中会存在很多问题,这些概念很容易混淆,掌握重写和重载的区别对学会使用多态的方式编写程序、提高程序的可维护性奠定了基础。
一、方法重写(overriding)
如何定义重写:在java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。重写体现了java优越性,重写是建立在继承关系上,它使语言结构更加丰富。在java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。在java中覆盖继承父类的方法就是通过方法的重写来实现的。
所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。这样,就可以实现对父类方法的覆盖。例如:下面的代码实现了方法的重写。
class person//定义父类
{public void print(){//父类中的方法
system.out.println("父类person的print方法!");
}
}
class student extends person//定义子类继承person类
{public void print(){//方法的重写
system.out.println("子类student的print方法!");
}
}
public class overrideexample01
{public static void main(string args[])
{student s=new student();
s.print();
}
}
运行结果:子类student的print方法!
可以看出,当子类重写了父类中的print()方法后,使用s调用的是子类的print()方法,父类中的print()方法被覆盖了。也就是说,如果现在子类将父类中的方法重写了,调用的时候肯定是调用被重写过的方法,那么如果现在一定要调用父类中的方法该怎么办呢?此时,通过使用super关键就可以实现这个功能,super关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.方法名(参数列表)”的形式调用。例如:
class person
{public void print(){
system.out.println("父类person的print方法!");
}
}
class student extends person
{public void print(){
super.print(;//访问父类中被子类覆写过的方法
system.out.println("子类student的print方法!");
}
}
public class overrideexample02
{public static void main(string args[])
{student s=new student();
s.print();
}
}
运行结果:父类person的print方法!
子类student的print方法!
如果要使用super关键字不一定非要在方法重写之后使用,也可以明确地表示某个方法是从父类中继承而来的。使用super只是更加明确的说,要从父类中查找,就不在子类查找了。
二、重写规则
在重写方法时,需要遵循以下的规则:
(一)父类方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。
(二)父类的返回类型必须与被子类重写的方法返回类型相同,否则不能称其为重写而是重载。
(三)java中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限。访问权限大小关系为:private<default<protected<public。
编写过java程序的人就知道,父类中的方法并不是在任何情况下都可以重写的,当父类中方法的访问权限修饰符为private时,该方法只能被自己的类访问,不能被外部的类访问,在子类是不能被重写的。如果定义父类的方法为public,在子类定义为private,程序运行时就会报错。例如:
class person
{public void print(){//public访问权限
system.out.println("父类person的print方法!");
}
}
class stedent extends person
{private void print(){//重写方法降低了访问权限,错误
system.out.println("子类student的print方法!");
}
}
(四)由于父类的访问权限修饰符的限制一定要大于被子类重写方法的访问权限修饰符,而private权限最小。所以如果某一个方法在父类中的访问权限是private,那么就不能在子类中对其进行重写。如果重新定义,也只是定义了一个新的方法,不会达到重写的效果。
(五)在继承过程中如果父类当中的方法抛出异常,那么在子类中重写父类的该方法时,也要抛出异常,而且抛出的异常不能多于父类中抛出的异常(可以等于父类中抛出的异常)。换句话说,重写方法一定不能抛出新的检查异常,或者比被重写方法声明更加宽泛的检查型异常。例如,父类的一个方法申明了一个检查异常ioexception,在重写这个方法时就不能抛出exception,只能抛出ioexception的子类异常,可以抛出非检查异常。
同样的道理,如果子类中创建了一个成员变量,而该变量和父类中的一个变量名称相同,称作变量重写或属性覆盖。但是此概念一般很少有人去研究它,因为意义不大。
三、方法重载(overloading)
(一)如何定义重载。方法的重写和重载只有一个字不同,很多初学者认为这两者十分相似,其实不然。方法重载是让类以统一的方式处理不同类型数据的一种手段。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。
所谓方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。方法的重载在实际应用中也会经常用到。不仅是一般的方法,构造方法也可以重载。下面通过一个实例来分析重载的定义和使用方法。
class person
{string name;
int age;
void print(){
system.out.println("姓名:"+name+"年龄:"+age);
}
void print(string a,int b){
system.out.println("姓名:"+a+"年龄:"+b);
}
void print(string a,int b,int c){
system.out.println("姓名:"+a+"年龄:"+b+"id号:"+c);
}
void print(string a,int b,double c){
system.out.println("姓名:"+a+"年龄:"+b+"id号:"+c);
}
}
public class overloadexample01
{public static void main(string args[])
{person p1=new person();
p1.name="李明";
p1.age=22;
p1.print();
p1.print("王小早",19);
p1.print("金波",18,100325);
p1.print("婉宁",25,110903);
}
}
在上面的程序中,可以看到person类中有多个名为void print的方法,这就是方法的重载。执行程序,运行结果如下:
姓名:李明 年龄:22
姓名:王小早 年龄:19
姓名:金波 年龄:18 id号:100325
姓名:婉宁 年龄:25 id号:110903
在方法重载时,方法之间需要存在一定的联系,因为这样可以提高程序的可读性,一般只重载功能相似的方法。
(二)重载规则。重载是指我们可以定义一些名称相同的方法,通过定义不同的参数来区分这些方法,然后再调用时,java虚拟机就会根据不同的参数列表来选择合适的方法执行。也就是说,当一个重载方法被调用时,java用参数的类型和(或)个数来决定实际调用的重载方法。因此,每个重载方法的参数的类型或个数必须是不同。虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分所使用的是哪个方法。当java调用一个重载方法是,参数与调用参数匹配的方法被执行。在使用重载要注意以下的几点:
1.在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。例如,不同的参数类型,不同的参数个数,不同的参数顺序。当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int)。
2.不能通过访问权限、返回类型、抛出的异常进行重载。
3.方法的异常类型和数目不会对重载造成影响。
4.可以有不同的返回类型,只要参数列表不同就可以了。
5.可以有不同的访问修饰符。
6.可以抛出不同的异常。
四、方法重写与方法重载的区别
通过上面例子的分析,我们可以将方法重写和重载的区别总结成这样一个表格,如下:
区别点重载重写(覆写)
单词overloadingoverriding
定义方法名称相同,参数的类型或个数不同方法名称、参数类型、返回值类型全部相同
对权限没有要求被重写的方法不能拥有更严格的权限
范围发生在一个类中发生在继承类中

五、结束语
在面向对象程序设计的思想中,类的继承和多态性主要就是体现在子类重写父类的方法。而构造方法的重载作为方法重载的一个典型特例,可以通过重载构造方法来表达对象的多种初始化行为。灵活的运用方法重写与方法重载,不仅能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般。
分享到:
评论

相关推荐

    Java中方法重写与方法重载的比较.pdf

    Java中的方法重写(Overriding)与方法重载(Overloading)是面向对象编程中两个重要的概念,它们在实现多态性和代码复用时起到关键作用。本文将深入探讨这两个概念,以及它们在Java编程中的具体应用和区别。 1. **...

    Java重载和重写的区别--源码实例

    Java中的重载(Overloading)和重写(Overriding)是面向对象编程中的两种关键特性,它们涉及到方法的多态性。理解这两者的区别对于编写高效、可维护的代码至关重要。 **重载(Overloading)**是指在一个类中,可以有多个...

    Java重写和重载概念及区别梳理

    3. **final、static和abstract限制**:被`final`修饰的方法不能被重写,而`static`和`abstract`方法不能被覆盖,因为`static`方法属于类,不参与对象的实例化过程,而`abstract`方法在抽象类中定义,没有具体实现。...

    重写与重载

    - **实例方法与静态方法**:重载适用于实例方法和静态方法。 #### 示例: 在一个类中定义多个具有相同名称但参数列表不同的`add()`方法: ```java public class Calculator { public int add(int a, int b) { ...

    Java 2023.7.12(方法重写/重载、多态、抽象类/方法、instanceof)

    在Java编程语言中,方法重写(Method Overriding)和重载(Method Overloading)、多态(Polymorphism)、抽象类(Abstract Class)与抽象方法(Abstract Method)以及`instanceof`关键字是核心的面向对象特性。...

    java 函数的重载和重写实例代码

    重写发生在子类与父类之间,子类可以提供一个与父类相同名称和参数列表的方法,但其方法体必须不同,或者访问权限更高。在 `B` 类中,它继承了 `A` 类,并重写了 `print(A a)` 和 `print(D d)` 方法。例如,当调用 ...

    重写与重载的区别共2页.pdf.zip

    在这个例子中,`Dog`类通过`@Override`注解重写了`Animal`类的`sound`方法,当调用`Dog`实例的`sound`方法时,会输出"Dog barks",而不是父类的默认行为。 总结一下,重载和重写的关键区别在于: 1. 重载发生在同一...

    C++中重载与重写函数区别及虚函数

    ### C++中重载与重写函数的区别及虚函数详解 #### 一、虚函数概述 **1.1 虚函数定义与作用** 在C++中,虚函数是一种特殊的成员函数,它允许子类覆盖父类的行为。虚函数的核心在于实现多态性,即在运行时动态决定...

    实例分析java中重载与重写的区别

    【Java中的重载与重写】是面向对象编程中的两个重要概念,它们体现了Java的多态性,但有着明显的区别。 一、重载(Overloading) 1. 重载发生在同一类内部,允许存在多个同名方法,但这些方法的参数列表必须不同,即...

    重写equals方法

    例如,public boolean equals(Object o) 是一个正确的重写方法,而 public boolean equals(String o) 是一个重载方法,而不是重写方法。 equals 方法的实现 ------------------------- equals 方法的实现需要遵循...

    重写重载构造函数

    重写重载构造函数 重写是子类的方法覆盖父类的方法,要求方法名和参数都相同。重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同。 构造函数是在创建给定类型的对象...

    Delphi--抽象方法、重载、覆盖。继承实例

    在编程语言Delphi中,面向对象编程是其核心特性之一,其中包括了抽象方法、方法重载、方法覆盖以及继承等概念。这些概念是构建可扩展和可维护的代码的基础,让我们逐一深入理解。 首先,**抽象方法**是声明但未实现...

    如何在c#中用虚拟的方法实现重载?其实很简单

    - 使用 `new` 关键字定义了一个与基类 `A` 同名的方法 `F()`,这里没有使用 `virtual` 或 `override` 关键字,因此这是一个新的方法而不是重写。 - 重写了基类中的虚方法 `G()`。 3. **主函数 `Main`**: - 创建...

    [Java]重载,重写以及继承,多态的区

    总结来说,重载允许我们根据参数的不同来选择合适的方法,重写使得子类可以提供对父类方法的具体实现,继承则实现了代码的复用,而多态则是实现接口与实现类之间的灵活转换,增强了程序的可扩展性和可维护性。

    C++中重载、重写(覆盖)和隐藏的区别实例分析

    在C++中,面向对象编程涉及三个重要概念:重载(Overloading)、重写(Overriding,也称为覆盖)和隐藏(Hiding)。这些概念在理解C++的多态性和类继承机制时至关重要。 1. 重载(Overloading) 重载是指在同一个...

    java方法重写和super关键字实例详解

    Java 方法重写和 super 关键字实例详解 Java 方法重写是 Java 编程语言中的一种机制,允许子类提供特定于自己的实现以替代父类的方法。这种机制可以使得子类可以根据自己的需求来修改父类的方法,以满足自己的需求...

    C#中多态、重载、重写区别分析

    编译时多态主要通过方法的重载实现,而运行时多态则是通过方法的重写来实现。例如: ```csharp BaseClass b = new DerivedClass(); b.MyMethod(); // 运行时调用了 DerivedClass.MyMethod() ``` 在这个例子中,...

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

    重写发生在子类与父类之间,当子类中定义了一个与父类完全相同的方法(包括方法名、参数列表以及返回值类型),这就是重写。重写的目的在于子类可以提供与父类不同的行为。例如: ```java public class ...

    继承与方法的重载学习代码

    文章可能包含了创建类、定义构造函数、覆盖父类方法(方法重写)、访问控制修饰符(public, private, protected)以及如何在子类中调用父类构造器(使用`super`关键字)等实践案例。这些知识点在实际编程中经常遇到...

Global site tag (gtag.js) - Google Analytics