文章目录
一、方法重载
1. 含义
重载(overloading) 是在一个类中,必须改变原同名方法的参数列表,其他可以按需改变来创建一个新的同名方法。
常见的有构造器的重载,overroad,相当于重新装参数,但是其实现不一定修改。
2. 特点
(1) 重载前提
同一个类中或子类中继承父类的可访问方法
(2) 重载要求
参数类型修改
3. 示例
class Addoperator {
public int add(int a, int b) {
int c;
c = a + b;
return c;
}
}
class Addoperator2 extends Addoperator {
public double add(double a, double b) { // 子类重载了方法,参数类型改变了
double c;
c = a + b;
return c;
}
}
public class Test {
public static void main(String[] args) {
int a = 10;
int b = 23;
int c;
double a1 = 10;
double b1 = 20;
double c1;
Addoperator addoperator = new Addoperator();
c = addoperator.add(a, b);
System.out.println(c); // output: 33
Addoperator2 addoperator2 = new Addoperator2();
c1 = addoperator2.add(a1, b1);
System.out.println(c1); // output: 30.0
}
}
二、方法重写
1. 含义
重写是子类对父类的允许访问的同名实例方法的实现过程(方法体)进行重新编写, 参数列表不能改变,其他改变要使方法使用更广泛。
返回值类型可以改变,但是只能是父类的派生类,其他改变如访问修饰符、异常要比之前限制相同或更小,即访问范围相等或更大,异常不能抛出新的强制性异常或改写其异常更加广泛
2. 规则
(1) 重写前提
- 子类需要继承父类且其能访问到的实例方法才能重写(类方法不能重写)
- static final这些修饰符的方法不能重写
- 构造方法不能重写
(2) 重写要求
- 重写的方法不能改变参数列表,返回值类型不修改或是父类派生类
- 重写的方法访问修饰符访问不变或更广泛,异常不变或更少限制
3. 简单示例
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
super.move(); // 应用super类的方法
System.out.println("狗可以跑和走");
}
}
public class TestDog{
public static void main(String args[]){
Animal b = new Dog(); // Dog 对象 多态
b.move(); //执行 Dog类的方法
}
}
output:
动物可以移动
狗可以跑和走
三、对比
1. 目的
如果我们把方法理解成对数据的处理的话,那么参数列表、返回类型其实是处理数据的类型和返回数据的类型,具体处理数据方式是方法体里面的内容。
那么很容易看出,方法重写被限制住不能修改处理数据类型以及让方法使用更加广泛受到更少限制之类能看到其实它目的是主要改变其处理数据的方式而不是类型。因为它是继承父类的,从现实层面理解就是虽然你做事的方式有很多种,但是我们做事就是为了那个目的(处理这类型数据),以及让你重写就是要讲方法发扬光大,所以不能有更多限制。
但是方法重载没有这种来自祖宗的遗训,它的目标是为了更加方便本类使用,所以它的限制就是修改参数列表即处理数据的类型和多少,因为如果它不修改参数列表,它其他本身就可以在自己原来方法修改,没必要重载一个方法,它重载肯定是为了处理不同类型或者数量的数据,至于修改之后其他就按需修改。
注意:方法重载和方法重写还有不同在于方法重载必须修改方法的形参列表,而方法重写是不能修改方法形参列表,其他修改必须让这个方法的访问更加广泛或相等,这区别在于方法重写可以有跟父类一样的方法
public class FuMethod {
public void print(int a, int b){ // 方法重载必须修改形参列表,否则报错
System.out.println(a);
}
public void print(int a){
System.out.println(a);
}
public static void main(String[] args) {
FuMethod fuMethod = new FuMethod();
}
}
class ZiMethod extends FuMethod{
public void print(int a){ // 子类可以有跟父类一样的成员方法,意味着子类重写父类方法是不需要强制修改任何东西而子类重载父类方法必须修改形参列表
System.out.println(a);
}
}
2. 意义
(1) 概念
- 重写是更好实现父类的期望要求,更好支持子类与父类多态的一种体现
- 重载是让类中原有方法能处理不同类型数量的数据,是类中多态性的一种体现
(2) 好处
让代码更有可读性,增强了代码复用性
四、总结
总的来说,方法重写和重载的出现为了增强代码复用性,减少代码冗余,它们有着不同的目标,所以有着不同的特点和使用规则。