Java中重载与重写的区别

重载

        重载也叫做编译时多态,指一个类中可以有多个方法具有相同的名字,但这些方法的参数不同(参数的类型和个数不同)。那么代码编译的时候,就会根据参数自动选择相对应的方法编译运行。

        如果方法名和参数都是一样的,只依靠方法返回值类型的不同,或者方法返回值的不同,编译器是无法区分该调用哪个方法的,所以不能只依靠方法返回值不同来实现方法的重载。

        如果一个方法的参数不同了,也就是已经满足了重载的条件了,这个时候,方法返回值就可以不同了。

        总而言之,方法的返回值不同不能实现重载,而已经满足重载条件的方法,其返回值可以不同。

        请参考下面代码进行理解:


//重载也是一种多态
public class overload {
    public static void main(String[] args) {
        double a=10.1;
        double b=10.1;
        int c=10;
        int d=20;
        double e=5.0;
        add(a,b);
        add(c,d);
        add(a,c);
        add(c,a);
        add(a,b,e);
    }

    public static void add(double a,double b){
        double c=a+b;
        System.out.println(c);
    }

    public static void add(int a,int b){        //返回值数据类型是void
        int c=a+b;
        System.out.println(c);
    }
    public static void add(double a,int b){
        double c=a+b;
        System.out.println(c);
    }
    public static void add(int a,double b){
        double c=a+b;
        System.out.println(c);
    }

    public static void add(double a,double b,double e){
        double c=a+b+e;
        System.out.println(c);
    }
}
    //重载是指一个类中可以有多个方法具有相同的名字,但这些方法的参数不同;
    //判断重载不是看返回值数据类型,先看参数,由于下面这个add方法参数跟前面有个方法的参数一样了,
    //然后两个add()方法发返回值数据类型不同(一个是void,一个是int),编译器不知道用哪个来编译代码。所以可以说重载是根据参数的数据类型的不同来实现的,若方法返回值的数据类型不同则无法实现重载。

//    public static int add(int a,int b){         //返回值数据类型是int
//        int c=a+b;
//        System.out.println(c);
//        return c;
//    }

重写

         重写也叫运行时多态,重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

        重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

(1)在类的继承中,总会使用到重写。

public class Demo {
    public static void main(String [] args){
        Student student = new Student();
        student.display();
        student.work();
    }
}
class Person {
    String name;
    public void work(){
        System.out.println("尽心尽力地工作");
    }
    public void display(){
        System.out.println("这是一个Person类");
    }
}
class Student extends Person {
    public void display(){
        System.out.println("这是一个Student类");    //重写
    }
}

        当子类需要父类的功能,而功能主体子类有自己持有内容时,可以重写父类中的方法,这样既沿袭了父类的功能,又定义了子类特有的内容。

        如同上面子类Student继承了父类,所有继承了父类的方法display(),但子类持有自己的内容,所以在从父类继承下来的diaplay()方法中重写了方法中的内容("这是一个Student类")。

(2)不仅在普通的类的继承中会使用到重写,在抽象类的继承中也会用到。

        如果一个类继承了抽象类,那么它必须实现抽象类的所有抽象方法,而实现其抽象方法就需要使用到重写方法。

public abstract class Teacher {
    public abstract void work();
}
class MathTeacher extends Teacher{
    public void work(){                    //重写work()方法
        System.out.println("我正在上数学课");
    }
}
class ChineseTeacher extends Teacher{
    public void work(){                    //重写work()方法
        System.out.println("我正在上语文课");
    }
}


public class Demo {
        public static void main(String[] args) {
            MathTeacher mathteacher = new MathTeacher();
            mathteacher.work();
            ChineseTeacher chineseteacher = new ChineseTeacher();
            chineseteacher.work();
        }
}

 (3)重写在接口中也会频繁使用。

eg.

class 类 implements 接口{

        重写接口中的方法

}

        在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑。当一个类需要某些功能时,就实现具有这些功能的接口,在接口中定义的功能,就叫功能的声明;在类中重写的方法,实现了功能,就叫功能的具体实现。

public class Demo {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.Func();
        Computer computer = new Computer();
        computer.Func();
    }

}

public interface Usb {          //接口定义时需要使用interf关键字
    void Func();
}
class Phone implements Usb{         //类实现接口使用implements
    @Override
    public void Func() {            //类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要<重写>该抽象方法
        System.out.println("通过usb接口,给手机充电");
    }
}
class Computer implements Usb{      //类实现接口使用implements
    @Override
    public void Func() {            //类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法
        System.out.println("通过usb接口,进行数据转移");
    }
}

以上列举了几个关于重写的运用,重写在其他方面也有许多运用,如在异常中的运用等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

تچ快乐杂货店يچ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值