前言 :
很早的时候,我就知道这两个东西,但是,也仅仅是停留在知道的程度而已,对于什么是重写,什么事重载,还是感到十分的迷惑,迷茫。正好,在软考复习时又经历这两个东西,细心一点,探究了一下,有点收获,借助java程序,想分享给大家
定义:
重载(overload),重载是可使函数、运算符等处理不同类型数据或接受不同个数的参数的一种方法。简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法,目的当然是处理不同类型数据
重写(override或者overwrite),派生类继承基类的方法,因此,在调用对象继承方法的时候,调用和执行的是基类的实现.但是,有时需要对派生类中的继承方法有不同的实现,重写"基类方法就是修改它的实现或者说在派生类中重新编写实现方法
重写一般多发生在不同的类且存在继承关系之间,而重载多是在一个类里或者一块代码段里,由于重载可以在同一个类中定义功能类似的函数,调用方法是通过传递给他们不同参数个数和参数类型来决定具体使用那个方法。这给程序员管理类的相似函数提供了极大的方便
特点
重载:函数名必须相同,返回值可以相同,也可以不同,但是特征标必须不同。
重写:子类与父类某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类,子类函数的访问修饰权限不能少于父类的
举例说明:
package test; /** * * @author 李卫中 */ public class Test { public static void main(String[] args){ Person person1=new Person(); //new了一个系统默认的Person的构造方法 person1.getInfo(); //************************ person1.name="米老师(1)"; person1.age=19; person1.getInfo(); //赋值区 //************************ Person person2=new Person("米老师",18); //new是Person的重载的构造方法,内带参数name,age person2.getInfo(); //************************** Teacher teacher1=new Teacher(); teacher1.getInfo(); //重写父类Person类的getInfo方法 //************************** teacher1.name="姜老师1"; teacher1.age=21; teacher1.sex="女1"; teacher1.getInfo(); //赋值区 //************************** Teacher teacher2=new Teacher("姜老师",20,"女"); teacher2.getInfo(); } } class Person{ String name; int age; //以上部分为Person类的成员变量 Person(){} Person(String _name,int _age){ //对Person类的Person()构造方法重载,一样的方法名,不 一样的的参数,参数类型 this.name=_name; this.age=_age; //this,有就近声明原则,也就是说,他离哪个类近,就可以代表那个类( 本类内,代表Person类) } public void getInfo(){ System.out.println("我叫"+name+" "+"我的年龄是:"+age); } } class Teacher extends Person{ String sex; Teacher(String _name,int _age,String _sex){ super(_name,_age); this.sex=_sex; } Teacher(){ super(); //其实,如果没有super的话,编译器会默认去选择父类中没有参数的构造方法 } public String teachBookName(String bookName){ return bookName; } public void getInfo(){ System.out.println("我叫"+name+" 我的年龄是:"+age+" 我的性别是"+sex); //对父类中的getInfo()方法进行重写,算是一种覆盖 } }
运行结果:
应该很明显了吧。
收获
对于方法重载,就是说,我给你规定个处理某种情况的方法名,而内部具体参数我不做要求,你可以随意定义一个符合你需要的方法,但是要注意,方法名不能变,但是参数值,参数类型,返回值类型,就看你心情了,可以一样,也可以不一样
对于重写,我给你指定了一个方法,包括方法需要的参数类型,这些你是不能动的,但是你可以灵活的去谢你学要的方法,然后父类的方法就被覆盖了,执行子类自己的方法。
小结
感觉现在学习的知识都是对前面的深入和补充,以前我没有即时总结,在这一阶段的工程中,正是我们深入探究为什么的过程,正好可以弥补我们以前的遗憾,好好学习,打牢基础,对我们接下来的学习有百利而无一害
友情提示:如果您想知道运行结果区为何会出现如此情况,或者他们在内存里是怎么做到的,请继续关注我的系列博客(内存分析)