首页 后端开发 php教程 方法重写与方法重载

方法重写与方法重载

Nov 30, 2016 am 09:37 AM
方法重写 方法重载

继承和多态都是面向对象程序设计的特点。使用继承可以在一个父类的基础上再创建一个子类,这个子类不但拥有父类已有的属性和方法,还可以创建属于自己的属性和方法。由于子类和父类之间的关系,从而引出了方法重写和方法重载的问题。方法重写及方法重载在继承和多态性方面的应用中会存在很多问题,这些概念很容易混淆,掌握重写和重载的区别对学会使用多态的方式编写程序、提高程序的可维护性奠定了基础。

一、方法重写(0veriding)
如何定义重写:在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。重写体现了Java优越
性,重写是建立在继承关系上,它使语言结构更加丰富。在Java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。在Java中覆盖继承父类的方法就是通过方法的重写来实现的。

所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。这样,就可以实现对父类方法的覆盖。例如:下面的代码实现了方法的重写。

class Person//定义父类
fpublic void print(){//父类中的方法
System.out.println( 父类Person的print方法! );
}
}
class Student extends Person//定义子类继承Person类
{public void print(){//方法的重写
System.out.println( 子类Student的print方法! );
}
}
public class 0verrideExampleO1
{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中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限。访问权限大小关系为:

编写过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,intC){ 
System.out.println("姓名:"+a+"年龄:" +b+"ID号:" +c); 
}
void print(String a,int b,doubleC){ 
System.out.println("姓名:"+a+"年龄:" +b+"ID号:"+c); 
} 
}
public class OverLoadExampleOL 
{publicstaticvoidmain(String args[]) 
{Personpl=newPerson();
p1.nanle="李明";
p1.age=22;
p1.print(); 
p1.print("王小早",19); 
p1.print("金波",18,100325); 
p1.print("婉宁",25,110903); 
} 
}
登录后复制

在上面的程序中,可以看到Person类中有多个名为 void print的方法,这就是方法的重载。执行程序,运行结果如下:

姓名:李明年龄:22
姓名:王小早年龄:l9
姓名:金波年龄:18ID号:10 00325
姓名:婉宁年龄:25ID号:110903

在方法重载时,方法之间需要存在一定的联系,因为这样可以提高程序的可读性,一般只重载功能相似的方法重载规则。重载是指我们可以定义一些名称相同的方法,通过定义不同的参数来区分这些方法,然后再调用时,Java虚拟机就会根
据不同的参数列表来选择合适的方法执行。也就是说,当一个重载方法被调用时,Java用参数的类型和.. (或)个数来决定实际调用的重载方法。因此,每个重载方法的参数的类型或个数必须是不同。虽然每个重载方法可以有不同的返回类型,
但返回类型并不足以区分所使用的是哪个方法。当Java调用一个重载方法是,参数与调用参数匹配的方法被执行。在使用重载要注意以下的几点:

1.在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。例如,不同的参数类型,不同的参数个数,不同的参数顺序。当然,同一方法内的几个参数类型必须不一样,例如可以是 fun(int,float),但是不能为 fun(int,int)。
2.不能通过访问权限、返回类型、抛出的异常进行重载。
3.方法的异常类型和数目不会对重载造成影响。.. 
4.可以有不同的返回类型,只要参数列表不同就可以了。
5.可以有不同的访问修饰符。

6.可以抛出不同的异常。

四、方法重写与方法重载的区别
通过上面例子的分析,我们可以将方法重写和重载的区别总
结成这样一个表格,如下:

2255.jpg

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Go语言为何不支持方法重载的设计理念 Go语言为何不支持方法重载的设计理念 Apr 04, 2024 am 09:00 AM

Go语言不支持方法重载,因为其设计理念强调简单性、并发性和类型安全性。方法重载会引入名称冲突、复杂的类型系统和代码混淆。为了弥补这一点,Go语言提供了函数,允许在同一个包中创建具有相同名称但不同参数类型的函数,类似于方法重载的功能。

Go语言方法重载不可行的原因及解决方案 Go语言方法重载不可行的原因及解决方案 Apr 03, 2024 pm 12:33 PM

Go语言不支持方法重载,原因包括静态类型检查复杂性、清晰度下降以及与接口的不兼容性。替代方案包括函数重载、接口方法和多态性。具体而言,函数重载允许创建具有不同参数列表的同名函数,接口方法使用接口定义方法并在不同类型中实现它们,而多态性使用类型转换和断言来实现具有不同类型参数的对象方法的调用。

深入探讨Go语言中的方法重载问题 深入探讨Go语言中的方法重载问题 Apr 03, 2024 pm 01:36 PM

Go语言不支持直接方法重载,而是使用接口来模拟类似功能。接口定义一组方法,类型通过实现接口的方法来模拟重载,使用不同接口定义不同参数列表的相同方法,创建类型实现这些接口,从而达到方法重载的效果。

如何在Go语言中实现方法重载 如何在Go语言中实现方法重载 Apr 03, 2024 pm 12:15 PM

Go语言中不支持方法重载,但可以使用接口模拟。方法重载步骤:1.创建包含所有可能签名的接口;2.实现具有不同签名的多个方法,实现该接口。

Golang函数的方法重载解析 Golang函数的方法重载解析 May 16, 2023 am 08:36 AM

在Golang中,函数的重载(Overloading)是不被支持的,因为函数名称是唯一的,在相同的作用域内定义两个同名的函数是不被允许的。但是,Golang提供了一种方法重载的替代方案,即方法重载。方法重载(MethodOverloading)是一种在类中定义相同名称的方法,但是它们的参数列表是不同的。在本文中,我们将详细了解Golang中的方法重载。什么

Java 函数重载机制中如何确定最匹配的方法? Java 函数重载机制中如何确定最匹配的方法? Apr 26, 2024 am 09:06 AM

Java函数重载匹配规则为:精确匹配:参数类型和数量完全相符符合可变参数:可变参数方法匹配任意数量或类型的参数包装类型与原始类型转换:基本类型与包装类型可相互转换自动装箱/拆箱:基本类型值与包装类型对象可自动转换派生类类型:派生类对象可匹配基类类型参数

揭开 Python 继承与多态的神秘面纱,开启编程新境界 揭开 Python 继承与多态的神秘面纱,开启编程新境界 Feb 20, 2024 pm 09:15 PM

在python中,继承和多态是面向对象编程(OOP)中强大的概念,它们使代码更具可扩展性、可重用性和可维护性。本文将深入探讨Python中的继承和多态,揭开它们的神秘面纱并展示它们的强大功能。继承继承允许一个类(子类)从另一个类(父类)继承属性和方法。通过继承,子类可以重用父类中已经定义的代码,从而减少重复和提高代码可维护性。语法:classSubclass(Superclass):#子类独有的属性和方法演示代码:classAnimal:def__init__(self,name):self.n

在Go语言中优雅地处理方法重载的替代方案 在Go语言中优雅地处理方法重载的替代方案 Apr 03, 2024 am 10:15 AM

Go语言中没有方法重载,但可以使用替代方案实现类似行为:函数变量:定义具有不同参数集的函数,并将其存储在变量中,根据需要调用适当的函数。接口类型:定义一个接口类型,其中包含具有不同参数集的多个方法,并实现该接口以提供特定行为。嵌套类型:将方法分组到嵌套类型中,其中每个嵌套类型表示不同数量或类型参数的函数。

See all articles