当前位置: 首页 > 工具软件 > Overload > 使用案例 >

重载(Overload)和重写(Overide)

邬浩涆
2023-12-01

重载(Overload)

重载是在同一个类中对已有方法的再次编程,它的目的是在使用时能适应更多情况。

这里拿构造函数举例理解:

public class IdCard {
    public String name;
    public int age;
    public String sex;
    public String address;

    //一个形参
    public IdCard(String name){
        this.name = name;
        age = 0;
        sex = null;
        address = null;
    }
    //两个形参
    public IdCard(String name, int age){
        this.name = name;
        this.age = age;
        sex = null;
        address = null;
    }
    //三个形参
    public IdCard(String name, int age, String sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.address = null;
    }
    //四个形参
    public IdCard(String name, int age, String sex, String address){
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.address = address;
    }
}


可以看到代码中同名构造函数有四个(其实系统还默认添加了一个无参构造函数),区别在于每一个构造函数中的形参数量不同,这种做法就是重载(Overload),这让这个类的使用者在使用的时候更加自由,不必局限于有限的信息,而且不用更换函数名。

public class Main {
    public static void main(String[] args) {
        IdCard a = new IdCard("孙行者");
        IdCard b = new IdCard("者行孙",500);
        IdCard c = new IdCard("行者孙",500,"无");
        IdCard d = new IdCard("孙悟空", 500,"无", "花果山水帘洞");
    }
}

重载的规则:

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

重写(Override)

重写的发生前提是两个类发生了 “继承(extends)” 关系,就是要至少有一个类还有一个继承该类的子类,而且要重写的方法(或字段)在父类中已经存在了(重写,重写,顾名思义就是将已经存在的方法重写一遍),重写(Override)这个操作很好的体现了Java化繁为简的特性,对于有一些具有普遍性的方法,可以先在父类中写出这个方法的雏形,然后根据这个父类的子类们可能各不相同的具体需要,在子类中将这个原始的方法进行拓展甚至完全的重新实现。

//这是一个 “人类” 父类类
public class Person {
    public String name;
    public int age;

    public void behavior(){
        System.out.println("吃饭,睡觉,打豆豆。");
    }
}

这是一个父类,他里面的成员变量是一个人类的基本信息,方法behavior() 中呈现的也是一个人类的基本行为,这些东西是所有人类都具备的,最原始的。

下面看几个该父类的子类:

//这是一个 “医生” 子类,继承自 “人类” 类
public class Doctor extends Person{
    public void Behavior(){
    	//super + " . " 可以调用父类的方法
        super.behavior();
        System.out.println("治病救人为本职");
    }
}

可以看到,这个类中对父类的 behavior() 方法进行了重写,他在原来人类原始能力的基础上(),加入了作为医生的能力。

重载的规则:

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

以上就是我对重写(Override)和重载(Overload)的简单理解,如果各位看官发现有错误的地方,希望能告诉我。

 类似资料: