Java - 写聊天程序碰到的坑:子类的成员变量和父类的成员变量同名
代码
父类
public class Data{
protected String owner;
protected String receiver;
public Data(String owner) {
this.owner = owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public String getReceiver() {
return this.receiver;
}
public String getOwner() {
return this.owner;
}
}
子类
class Message extends Data {
private String receiver;
private String message;
private boolean sendResult;
public Message(String owner, String receiver, String message) {
super(owner);
this.receiver = receiver;
this.message = message;
this.sendResult=false;
}
public void setSendResult(boolean sendResult) {
this.sendResult = sendResult;
}
public boolean sendResult() {
return sendResult;
}
public String getMessage() {
return message;
}
}
调用过程
public static void main(String args[]) {
Message a = new Message("owner", "receiver", "message");
System.out.print(a.getReceiver());
}
问题分析
我们执行
Message a=new Message("owner", "receiver", "message");
是调用Message类的构造函数,所以根据构造函数的内容,"receiver"这个字符串变量是存储在了子类的private String receiver这个成员变量中。
而我们调用getReceiver()这一方法时,如果没有在子类重写此方法,那么我们自然就是调用的Data类中的方法,返回的值自然也就是父类Data中的protected String receiver,在这里也就是空值
问题解决方法
其实从设计角度来看,我们不应当在子类中出现和父类的同名成员函数,要解决这样的问题,有几种方法:
-
直接去掉子类
Message中的private String receiver变量 -
在子类
Message中重写getReceiver()方法public String getReceiver(){ return this.receiver; } -
改写子类
Message的构造函数(不推荐):this.receiver = receiver改成super.receiver = receiver