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 
                    
                
                
            
        
浙公网安备 33010602011771号