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

posted @ 2021-12-15 18:09  ChisocDust  阅读(207)  评论(0)    收藏  举报