方法的重载与重写只有一字之差,而且都是类的多态的体现,初学很容易概念混淆。但稍加分析就能发现,他们看似相同,本质还是有很大差别的。
(一图区分重载与重写)
下面,我们来仔细看看两者的差异。
重载Overloading
概念:方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。
本质:方法重载是让类以统一的方式处理不同类型数据的一种手段。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是类中的多态性。
区分点:方法名相同,参数列表不同。对返回类型、访问权限没有要求
重载规则:
1.在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。例如,不同的参数类型,不同的参数个数,不同的参数顺序。当然,同一方法内的几个参数类型必须不一样,例如可以是 fun(int,float),但是不能为 fun(int,int)。
2.不能通过访问权限、返回类型、抛出的异常进行重载。
3.当Java调用一个重载方法时,参数与调用参数相匹配的方法被执行。
重写Overriding
概念:所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。这样,就可以实现对父类方法的覆盖。
本质:在Java中,子类可以继承父类的所有的特征,包括父类的方法和属性。但当子类需要拓展新的功能时,就要对父类继承来的方法进行修改,这就是重写,体现的是父类与子类之间的多态。
区分点:方法名、参数列表、返回类型均相同,且子类访问权限>父类访问权限
重写规则:
1.父类方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。
2.父类的返回类型必须与被子类重写的方法返回类型相同,否则不能称其为重写而是重载。
3.被子类重写的方法不能拥有比父类方法更加严格的访问权限。
当子类重写了父类中的方法后,优先调用的是子类重写的方法。那么如果现在一定要调用父类中的方法该怎么办呢?此时,通过使用.. super关键就可以实现这个功能,super关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.方法名(参数列表)”的形式调用。
练习:
下面哪些代码可放在Here处?
class Super{
protected float getNum(){return 3.0f;}
}
publicclass Sub extends Super{
//Here
}
a) floatgetNum(){return 4.0f;}
b) publicvoid getNum(){}
c) privatevoid getNum(double d){}
d) publicdouble Getnum(){return 4.0d;}
e) publicfloat getNum(){return 9;}
分析:
a:× 修饰符protected>默认,所以不能重写
b:× 既不是重写,也不是重载,所以不能放
c: √ 方法名相同,参数不同,(不关心返回类型),是方法重载
d: √ 方法名都不相同,既不是重写也不是重载,是不相关的两个方法当然可以放
e: √ public > protected, 标准的重写