Java中重载(Overload)和重写(Override)的区别

时间:2021-06-06 09:19:01

重载(Overload)

重载是指在一个类里面,方法名相同,参数不同。java中有构造器重载和方法重载(意义是一样的,叫法不同)

public class Car {
private String name;
private String price;

public Car() {
super();
}
public void carInfo(){
System.out.println("Car name:"+name+" Car price:"+price);
}
public void carInfo(String str){
System.out.println("Car name:"+name+" Car price:"+price+str);
}
public Car(String name, String price) {
super();
this.name = name;
this.price = price;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPrice() {
return price;
}

public void setPrice(String price) {
this.price = price;
}
}
public class Test {
public static void main(String[] args) {
/**
* 构造器重载
*/

Car car1 = new Car();
Car car2 = new Car("奥迪", "1000000");

/**
* 方法重载
*/

car2.carInfo();
car2.carInfo(" 价格劲爆");
}
}

为什么需要构造器重载呢?从上面的例子我们可以看出,当想以多种方式创建Car对象的时候我们就需要利用到构造器重载。
为什么需要方法重载呢?从上面的例子我们可以看到需要获取Car的信息我们可以调用car.getInfo();但是如果你想添加一些额外的信息呢?那我们就需要用car.getInfo(String str);这个方法了。有同学可能认为我可以不用方法重载啊,我取的方法名不一样不就行了吗,当然你也可以那么做。但是对于明显是相同的概念而使用了不同的名字,那一定会让人觉得不爽。有了方法重载之后,就可以为二者使用相同的名字了

剖析:

  1. 要是用和多个方法相同的名字,Java如何才知道你要使用的是哪一个呢,规则就是:每个重载的方法都必须要有一个独一无二的的参数列表。有同学可能会想到那参数的顺序不同也可以区分啊。只要参数的类型不一样,顺序不同确实可以区分,但是一般情况下不要那么做,因为这样的代码谁维护,谁吐血。
  2. 涉及基本类型的重载,大家要注意了。有两种情况,一如果传入的参数类型(实际参数类型)小于方法中声明的形式参数类型,实际类型就会被提升。二如果传入的实际类型比方法中声明的形式参数类型大,就得通过强制类型转换来执行,如果不这样,编译器会报错。(具体可以自己去尝试)

    可能有同学还想到能不能以方法的返回值来区分呢? 比如下面
    void a();
    int a(return 1);
    这不是很容易区分吗?
    这时候你就要站在编译器的角度去考虑问题了,如果你这样调用 int x = a();那编译器就可以根据语境做出判断你要调用的是 int a();但是有时候你调用方法并不关心返回值,你要的只是方法调用的其他效果。例如你就这样调用 a();那谁知道你想要调用的是哪个啊。因此根据方法的返回值来区分重载方法是行不通滴。

重写(Override)

重写是子类继续父类。子类对从父类继续过来的方法进行重写,返回值和参数类型都不能变,意思就是方法的外壳是一样的,核心是方法里面的代码的重写

public class Car(){
public void run(){
System.out.println("Car run");
}
}

public class BigCar extends Car(){
public void run(){
System.out.println("BigCar run");
}
}

public class Test{

public static void main(String args[]){
Car car = new Car(); // Car 对象
Car bigCar = new BigCar(); // BigCar 对象

car.run();// 执行 Car 类的方法 Car run

bigCar.run();//执行 BigCar 类的方法 BigCar run
}
}

什么时候需要重写呢,对从父类里面继承过来的东西不满意,不符合自己的要求,那我们就要重写

重写的规则:

  1. 参数列表必须完全与被重写方法的相同;
  2. 返回类型必须完全与被重写方法的返回类型相同;
  3. 访问权限不能比父类中被重写的方法的访问权限更高。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。