ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

面试题解七 - java 重载和重写的区别

2020-08-12 21:33:33  阅读:213  来源: 互联网

标签:java 题解 move 方法 子类 重载 父类 重写 public


重载和重写的区别
java中方法的重载和重写都是实现多态性的一种方式,区别在于前者实现多态性是在编译的时候,后者实现多态性是在运行的时候。

----重写(Override)----
重写的前提是继承,是子类对父类的方法的实现过程进行重新编写,方法重写参数类型、个数、顺序必须完全一致。重写的主要作用在于可以根据子类的需要,来特定属于子类的特定行为,这也是java多态性的一种实现方式。

例子:我们先创建一个动物类,该类中有一个move方法

public class Animal {
    public void move(){
        System.out.println("动物在跑动");
    }
}

我们再创建一个猫类,猫类继承动物类并且重写move方法

public class Cat extends Animal {
    @Override
    public void move() {
        System.out.println("猫可以跑也可以走");
    }
}

这个子类中的move方法的方法名与父类一样,而且参数都为空,所以作为子类的猫类的move方法是对父类move方法的重写

public class TestCat {

    public static void main(String[] args) {
        Animal a = new Animal();
        Animal b = new Cat();
        a.move();//执行父类animal中的move方法
        b.move();//执行子类cat中的move方法
    }
}

输出结果:

说明在运行的时候,jvm选择了运行了特定对象b中重写的move方法

方法重写规则总结

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

super关键字
当子类重写了父类的方法后,想要用到重写前父类的方法,就得使用super关键字
例子:

public class Animal {
    public void move(){
        System.out.println("动物在跑动");
    }
}
public class Cat extends Animal {
    @Override
    public void move() {
        super.move();
        System.out.println("猫可以跑也可以走");
    }
    public static void main(String[] args) {
        Animal a = new Cat();
        a.move();
    }
}

运行之后可以看到父类中被重写之前的方法被调用了

重载(Overload)
重载是在同一个类中进行的,同类中方法名相同,但是参数不同的方法就是重载方法,返回值类型不一定要相同。每一个重载的方法都必须满足要有一个独一无二的参数列表,这也是jvm决定运行哪一个方法的判别关键点。

public class Overload {
    //参数不同,返回值也不相同
    public int test1(){
        return 1;
    }
    public void test2(int a){
        System.out.println(a);
    }
    //返回值类型相同,参数顺序不同
    public void test3(int a,String b){
        System.out.println(b + a);
    }
    public void test4(String a, int b){
        System.out.println(a + b);
    }

    public static void main(String[] args) {
        Overload overload = new Overload();
        System.out.println(overload.test1());
        overload.test2(2);
        overload.test3(3,"c");
        overload.test4("d",4);
    }
}

运行结果:

重载规则

  1. 返回值类型并不是重载函数的区分标准,被重载的方法可以改变返回类型也可以不改变
  2. 被重载的方法必须改变参数列表(参数个数、类型、顺序至少有一项不一样)
  3. 被重载的方法可以改变访问修饰符
  4. 被重载的方法可以声明新的或更广的检查异常
  5. 方法重载只能发生在同一个类中
区别点 重载 重写
返回类型 可以修改 一定不能修改
参数列表 必须修改 一定不能修改
异常 可以修改 可以减少或者删除,但是不能抛出新的或者更广的异常
访问权限 可以修改 无法改为更严格的限制,可以降低限制

标签:java,题解,move,方法,子类,重载,父类,重写,public
来源: https://www.cnblogs.com/TidalCoast1034/p/13475194.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有