七、说说重载和重写的区别

211 阅读3分钟

重写(Override)

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

重写的规则

  • 参数列表与被重写方法的参数列表必须完全相同。
  • 返回类型与被重写方法的返回类型可以不相同,但是必须是父子类关系(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
  • 访问修饰权限不能比父类中被重写的方法的访问修饰权限更低(public 、protected 、default 、private 权限依次增加)
  • 父类被static, private, final修饰的方法不能被重写
  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private 和 final 的方法。
  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和 protected 的非 final 方法。
  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以
  • 构造方法不能被重写。
class Father{
    public void eat(){
        System.out.println("吃饭!");
    }
    
    public void work(){
        System.out.println("工作!");
    }
}

class Son extends Father{
    @Override
     public void work(){
        super.work();      // 在子类中可以使用super关键字调用父类方法
        System.out.println("学习!");
    }
}

重载(Overload)

重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

最常用的地方就是构造器的重载。

//构造器的重载
//定义一个"人"类
public class Person {
    //属性
    String name;
    int age;
    //空构造器(一般保证空构造器的存在,空构造器一般不会进行属性的赋值操作,默认不写也存在)
    public Person() {}
    //重载构造器,一般会重载构造器,在重载的构造器中进行属性的赋值操作
    public Person(String name,int age) {
        //在要表示对象的属性前加上this.来修饰,因为this代表的就是你创建的那个对象
        this.name = name;
        this.age = age;
    }
    //主方法
    public static void main(String[] args) {
        //创建一个名为person的对象,利用重载的构造器对其进行属性的赋值操作
        Person person = new Person("李四",18);
        System.out.println(person.name);
        System.out.println(person.age);
    }
}

重载的规则:

  • 在一个类中,方法名相同,参数不同(个数,类型,顺序不同)
  • 方法重载与访问修饰符,返回值类型,方法参数的名字都没有关系。
class Hello {
    public void hello() {
        System.out.println("Hello, world!");
    }

    public void hello(String name) {
        System.out.println("Hello, " + name + "!");
    }

    public void hello(String name, int age) {
        if (age < 18) {
            System.out.println("Hi, " + name + "!");
        } else {
            System.out.println("Hello, " + name + "!");
        }
    }
}

总结

方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

  • 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载。
  • 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写。
  • 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。