子类继承父类后复制粘贴变量和函数引起的歧义错误

       最近一直在开发一款白板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了。


猜你喜欢

转载自blog.csdn.net/cjzjolly/article/details/80514224