面试3:重载和重写的区别

定义

方法重载(OverLoad)

发生在同一个类中,方法名必须相同,参数类型、个数、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。

方法重写(Override)

发生在父子类中,方法名,参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类。访问修饰符范围大于等于父类;如果父类方法访问修饰符为private则子类不能重写该方法。

加深理解

方法重写

重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不会改变。壳不变,方法体重写
重写的好处在于子类可以根据自己的需要,定义自己的行为(方法体),也就是说子类能够根据自己的需要实现父类的方法。

方法重写例子

import java.io.IOException;

public class Override_OverLoad {
    public static void main(String[] args) throws Exception {
        Animal a = new Animal(); // Animal 对象
        Animal b = new Dog(); // Dog 对象
        a.eat();// 执行 Animal 类的方法
        b.eat();//执行 Dog 类的方法
    }
}
    class Animal {
    public void eat() throws Exception{
        System.out.println("动物吃东西");
    }
    private void move(){
        System.out.println("动物奔跑");
    }
}

    class Dog extends Animal {
    //子类抛出的异常必须小于等于父类抛出的异常
    //IOException是Exception的子类,当然这个地方不需要抛出异常,仅仅是为了举例。
    @Override
    public void eat() throws IOException {
        System.out.println("狗吃xx");
    }
    //父类private修饰的方法不能重写
    /*@Override
    public void move(){
        System.out.println("狗xxx");
    }*/
}

控制台输出

动物吃东西
狗吃xx

方法重写的原则

  1. 参数列表与被重写方法的参数列表必须完全相同;
  2. 返回类型与重写方法的返回类型可以不相同,但是必须是父类返回值的派生系(java7及更高版本规定);
  3. 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么子类中重写该方法就不能声明为protested;
  4. 父类的成员方法只能被它的子类重写;
  5. 声明为final的方法不能被重写;
  6. 声明为static的方法不能被重写,但是能够再次声明;
  7. 子类和父类在同一个包中,那么子类可以重写父类所有的方法,除了声明为private和final的方法;
  8. 子类和父类不在同一个包中,那么子类只能重写父类的声明为public和protected的非final方法;
  9. 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以;
    10.构造方法不能被重写;
    11.如果不能继承一个类,则不能重写该方法。

方法重写中super的用法

当子类调用父类被重写的原有方法时,可以通过super调用

public class Super {
    public static void main(String[] args) {
        Teacher teacher=new Teacher();
        teacher.teach();
    }
}
class People{
    public void study(){
        System.out.println("人都具备学习的能力");
    }
}

class  Teacher extends People {
    public void teach (){
        super.study(); // 应用super类的方法
        System.out.println("老师教书");
    }
}

控制台输出

人都具备学习的能力
老师教书

方法重载

每个重载的方法都必须有一个独一无二的参数类型列表

方法重载的规则

  1. 重载的方法必须改变参数列表(参数个数或类型不一样);
  2. 重载的方法可以改变访问类型;
  3. 重载的方法可以改变访问修饰符;
  4. 重载的方法可以声明新的或者更广的检查异常;
  5. 方法能够在同一个类或者一个子类中被重载;

方法重载的例子

public class OverLoad {
    public static void main(String[] args) {
        OverLoad o = new OverLoad();
        System.out.println(o.test());
        o.test(1);
        System.out.println(o.test(1, "test3"));
        System.out.println(o.test("test4", 1));
    }
    public int test() {
        System.out.println("test1");
        return 1;
    }
    private void test(int a) {
        System.out.println("test2");
    }
    //以下两个参数类型顺序不同
    public String test(int a, String s) {
        System.out.println("test3");
        return "returntest3";
    }
    public String test(String s, int a) {
        System.out.println("test4");
        return "returntest4";
    }
}

控制台输出

test1
1
test2
test3
returntest3
test4
returntest4

问题

方法重写是java多态的一种体现运行时的多态,那方法重载呢?

如有错误,欢迎指正

文章参考地址:https://www.runoob.com/java/java-override-overload.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值