上一章讲到了方法的重写,重写是指子类重写编写从父类中继承下来的方法。通过这种形式将共性转换成特性,将父类的共性方法修改成适合子类使用的特有方法。
这一章讲方法的重载,重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
了解了重载的定义,我想问的是,为什么要有重载?
String s1 = new String();
String s2 = new String("overloading");
String s3 = new String(new char[]{'a','b','c','d','e','f'},1,2);
System.out.println(s1);//内容为空
System.out.println(s2);//overloading
System.out.println(s3);//bc
相信部分人通过上面两行代码就已经猜测到了,下面我通过上面的实例详细的讲解一下重载的用途。
public String() {
this.value = new char[0];
}
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
public String(char value[], int offset, int count) {
if (offset < 0) {
throw new StringIndexOutOfBoundsException(offset);
}
if (count < 0) {
throw new StringIndexOutOfBoundsException(count);
}
// Note: offset or count might be near -1>>>1.
if (offset > value.length - count) {
throw new StringIndexOutOfBoundsException(offset + count);
}
this.value = Arrays.copyOfRange(value, offset, offset+count);
}
上面的三个方法是String类的部分构造函数源码,对应生成三个String类实例的时候所调用的三个不同的构造函数。
String s1 = new String();这行代码所调用的是第一个构造函数,将一个长度为0的char数组赋给value。
String s2 = new String("overloading");这行代码调用的是第二个构造函数,将输入的字符串的值和hash值赋给相应的变量。
String s3 = new String(new char[]{'a','b','c','d','e','f'},1,2);这行代码调用的是第三个构造函数,截取从下标为1开始,总量为2的元素,也就是b和c,将b、c组成新的char数组赋给value变量。
这三行类似的代码却实现了完全不同的功能。撰写重载方法的时候是比较痛苦的,且要遵循一定的规范。但是使用起来非常的方便,因为只需要一种调用方式就可以实现不同的功能。这就是方法重载的好处也就是我们为什么要使用重载。
重载的规则:
重载和重写的区别:
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
- 无法以返回值类型作为重载函数的区分标准。
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |