java方法覆盖的一点研究
作者:网络转载 发布时间:[ 2016/10/14 10:33:22 ] 推荐标签:Java 测试开发技术
对于方法覆盖,本来我的理解是:子类覆盖父类的方法,当子类的方法签名与父类一致时,算覆盖了父类的方法。然而在研究String相关类源码是发现了这样的代码:
/**
* AbstractStringBuilder是StringBuilder和StringBuffer的抽象父类。
*AbstractStringBuilder类append()方法
*/
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
/**
* StringBuilder类的append()方法
*/
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
猛一看没什么问题,方法名相同,入参一致,子类中还调用的父类的方法,子类确实是覆盖子类了。可是等等,它们的返回值类型居然不一致。
JDK的代码怎么会有问题,我在本地写了两个类,同样的方式,也可以。然后我猜测,应该是子类的返回类型正好是父类方法返回类型的子类(这个例子的确有点特殊,返回值正好是本身),于是我又做了个实验:
//创建了两个空类,测试用
public class Foo {
}
class Bar extends Foo{
}
/**
* People作为父类,定义了一个方法
*/
public class TestPeople {
Foo test(Foo f){
return new Foo();
}
}
public class TestStudent extends TestPeople {
/**
* 注意返回值为Bar,父类中返回值为Foo,说明子类返回值类型为父类返回值的子类型也可
* @param foo
* @return
*/
@Override //强制加覆盖注解为测试是否真正覆盖了父类方法
Bar test(Foo foo) {
return new Bar();
}
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11