最近一直在开发一款白板APP,同事负责的部分出现了一个奇怪的BUG。操纵子类的add方法add了东西进去对象的某个表之后,getSize这个表却发现size为0,因此我试着debug一下,发现debug的时候能看到子类里面有东西的,但是调用该对象的getSize打印却总是size = 0,于是和同事都觉得会不会其实操作着的不是同一个表。结果debugger发现两个表变量名一致但是地址不一样,仔细看了看这两个超长的类,发现是因为子类复制了父类创建全局表的语句和add方法,导致出现了这种奇怪的问题。下面我们来用一个简单的例子体验一下这种坑爹的做法:
首先定义一个父类,里面有一个data数组表,单元类型为String,和一个addString方法用于添加字符串到该表、一个getSize()方法用于获取表的长度:
package com.test.superClassAndSonClass;
import java.util.ArrayList;
import java.util.List;
public class Father {
private List<String> data = new ArrayList<>();
public void addString(String str){
data.add(str);
}
public int getSize(){
return data.size();
}
}
一个子类,模仿坑爹的不小心复制粘贴的行为,一样具备了data表和addString方法(还坑到不加@override喔):
package com.test.superClassAndSonClass;
import java.util.ArrayList;
import java.util.List;
public class Son extends Father{
private List<String> data = new ArrayList<>();
public void addString(String str){
data.add(str);
}
public static void main(String[] args) {
Son son = new Son();
son.addString("1");
son.addString("2");
son.addString("3");
son.addString("4");
son.addString("5");
son.addString("6");
son.addString("7");
System.out.println(son.getSize());
}
}
然后我们在main方法入口实例化Son,并调用addString添加字符串到data中,结果调用son.getSize()时,得到结果为0
这是因为在调用方法和对象的时候,会优先找本类该名字的方法和对象,找不到才找父类的,所以addString的时候全add进去了之类的data里面了。但是getSize()子类没有,所以会找父类的getSize方法进行调用,而父类的getSize方法调用的是父类的data对象,而父类的data对象压根没动过,所以就成了长度为0了。