1、重载和重写的定义
重载,从简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者重载方法。准确来说就是在同一类中,一组“相同名称”的方法定义,参数不同(个数,类型,顺序)。
重写,简单来说就是重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。
重写规范的来说就是在Java和其他一些高级面向对象的编程语言中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
2、重载的作用和特点:
- 在同一个类中,针对某功能不同实现方法。要求方法的名称相同,但各自的参数不同(类型、个数、顺序)。构造方法可以重载。
- 方法重载发生在编译期。
- 重载方法的返回值类型可以不同。
- 重载方法应该完成类似的功能,例如String的indexOf(),substring()构造方法。
3、重写的作用和特点:
- 1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)
- 2.子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)
- 3.子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)
- 4.子类重写父类方法的返回值类型不能大于父类方法的返回值类型,即是说子类方法的返回值必 须和父类方法的返回值相同或是其子类。
- 5.父类与子类之间的多态性,对父类的函数进行重新定义。即在子类中定义某方法与其父类有相同的名称和参数。
- 6.若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
- 7.重写是为了增强类的重用性和复用性,扩展性。
5、重载示例
实现类:
package javaWork08_OOP;
public class Demo_oop_06 {
public static void main(String[] args) {
// 2。使用方法重载,实现数组的区间复制。
// public int[] copyOfRange(int[] original,int from); 从指定下标位置from 开始复制
// public int[] copyOfRange(int [] original,int from,int to);从指定下标置 from
// 开始复制,结束至下标位置 to
CopyOfRange copyOfRange = new CopyOfRange();
int[] array1 = { 6, 4, 6, 8, 4, 6, 7, 5 };
System.out.println(copyOfRange.copyOfRange(array1, 2));
System.out.println(copyOfRange.copyOfRange(array1, 2, 6));
}
}
方法类:
package javaWork08_OOP;
public class CopyOfRange {
// 使用重载方法
public String copyOfRange(int[] original, int from) {
String ret = "";
for (int i = from, k = 0; i < original.length; i++, k++) {
ret = ret + original[i];
}
return ret;
}
public String copyOfRange(int[] original, int from, int to) {
String ret = "";
for (int i = from, k = 0; i <= to; i++, k++) {
ret = ret + original[i];
}
return ret;
}
}
6、重写示例
实现类:
package com.ret.demo7;
public class Demo_oop_01 {
public static void main(String[] args) {
DidiOrder order1 = new DidiOrder();
System.out.println(order1);
MeituanOrder order2 = new MeituanOrder();
System.out.println(order2);
}
}
方法类:
package com.ret.demo7;
import java.util.UUID;
//订单类(父类)
public abstract class Order {
private String orderNo;
// 无参构造
public Order() {
orderNo = UUID.randomUUID().toString();
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
// 发送消息
public abstract void message();
}
//滴滴打车订单(子类)
class DidiOrder extends Order {
// override 重写
// 发生在子类中,是对父亲中的方法进行"覆盖"
// 方法名和参数必须与父类中的方法保持一致
@Override
public void message() {
System.out.println(super.getOrderNo() + "您的专车已抵达指定地点,请尽快上车!");
}
// 重写Object 父类的toString()
@Override
public String toString() {
return String.format("【滴滴专车订单】订单编号:%s", super.getOrderNo());
}
}
//美团外卖订单(子类)
class MeituanOrder extends Order {
// override 重写
// 发生在子类中,是对父亲中的方法进行"覆盖"
// 方法名和参数必须与父类中的方法保持一致
@Override
public void message() {
System.out.println(super.getOrderNo() + "您的外卖已抵达指定地点,请尽快领取!");
}
// 重写Object 父类的toString()
@Override
public String toString() {
return String.format("【美团外卖订单】订单编号:%s", super.getOrderNo());
}
}