重写和重载如何区分

1 重写

【子类中出现了和父类中一模一样的方法声明】 这种行为称为重写,也就是英文的@Override,这个词在英文中是【覆盖】的意思。
重写的一些规则:

  1. 父类的私有方法不能被子类继承,当然也无法重写。
  2. 两同两小一大原则, 方法名相同,参数类型相同,子类返回类型小于等于父类方法返回类型, 子类抛出异常小于等于父类方法抛出异常, 子类访问权限大于等于父类方法访问权限**。
    更详细的规则见:https://www.runoob.com/java/java-override-overload.html

2 重载

同一个类中,方法名相同,返回值随便,参数一定不同的】,这种行为称为重载,也就是英文的Overload。
重载的一些规则:

  1. 被重载的方法必须改变参数列表(参数个数或类型不一样);

3 相关题目

3.1 题目1

class Animal{
    public void move(){
        System.out.println("动物可以移动");
    }
}
class Dog extends Animal{
    public void move(){
        System.out.println("狗可以跑和走");
    }
    public void bark(){
        System.out.println("狗可以吠叫");
    }
}
public class TestDog{
    public static void main(String args[]){
        Animal a = new Animal();
        Animal b = new Dog(); 
        a.move();
        b.move();
        b.bark();
    }
}

该题的结果应该是【编译错误】,子类Dog重写了move()方法,但是父类Animal中没有bark()方法,不存在被重写的情况。
编译看左边,执行看右边。父类型引用指向子类型对象,无法调用只在子类型里定义的方法

3.2 题目二

class A{
    public A foo() {
        return this;
    }
}
class B extends A {
    public A foo(){
        return this;
    }
}
class C extends B {
    _______

}

要求在横线处添加的语句能够正常编译不报错:
A. public void foo(){}
B. public int foo(){return 1;}
C. public A foo(B b){return b;}
D. public A foo(){return A;}


B是A的子类,重写了A的foo()方法。C是B的子类, 这里讨论的应该是重写的问题。根据重写的规则:

两同两小一大原则, 方法名相同,参数类型相同,子类返回类型小于等于父类方法返回类型, 子类抛出异常小于等于父类方法抛出异常, 子类访问权限大于等于父类方法访问权限**。
A:返回类型错误
B:返回类型错误
C:参数类型不同,是就不是重写了。
D:返回了一个类,编译错误
所以正确答案是C。

我之前一直认为重载必须在一个类中,实际上不是的。idea中编译如下:

posted @ 2022-08-07 14:11  A07_xxxx  阅读(31)  评论(0)    收藏  举报