java中的神奇"this"

java中的神奇"this",神奇的原因事它能不用new就可以直接创造一个对象出来,后来研究发现,其实java的“this”使用时,也是"new"了一个当前的对象,不过这些操作我们看不到,因为其实是虚拟机jvm帮我们"new"了;

方法体中,有和成员变量重名的局部变量,啥都不加访问的是局部变量,this点出来的是成员变量,super点出来的是其父类的同名成员变量;

记录一个有趣的错误:

 
    // 咨询回复内容
    public String answer = "";

    // 咨询回复时间
    public String answerDate = "";

     // 咨询回复内容
    public String getAnswer() {
        return answer;
    }
    
    public void setAnswer(String answer) {
        answer = StringUtil.isBlank(answer) ? "" : answer;
    }
    
    // 咨询回复时间
    public String getAnswerDate() {
        return answerDate;
    }
    
    public void setAnswerDate(String answerDate) {
        answerDate = StringUtil.isBlank(answerDate) ? "" : answerDate;
    }

其中,这是一个类中定义了两个成员变量,自己手动加了对应的构造方法,以变量 answe 为例,在它的set方法中,方法体中的answer变量实际是它的入参,而不是这个类定义的那个成员变量,这样在调用这个类,然后点set设置其这个属性值的时候会一直是空,接口传回页面的值自然也是空,调试如图:

问题就是出在没有使用神奇的“this”,因为之前是手动加了对应的构造方法,变量名都是直接赋值的类定义的成员变量,现在用快捷键自动为这两个成员变量添加set和get构造方法:

添加后的构造方法是:

    // 咨询回复
    public String getAnswer() {
        return answer;
    }

    public void setAnswer(String answer) {
        this.answer = StringUtil.isBlank(answer) ? "" : answer;
    }

    // 咨询回复时间
    public String getAnswerDate() {
        return answerDate;
    }

    public void setAnswerDate(String answerDate) {
        this.answerDate = StringUtil.isBlank(answerDate) ? "" : answerDate;
    }

其中,还是以 answer 变量为例,构造方法的方法体中,加了“this”之后就变成了这个类的成员变量,后面进行非空判断规避异常的处理中的 answer 变量就是该方法的入参了,区别就是这个;

这时候再通过调用接口,前端调试:

就是可以调用这个类的成员变量的get/set构造方法进行获取和赋值了;

它的机制原理就是在”this“的时候jvm会自动"new"一个这个类的实例,然后点set这个方法;

原文地址:https://www.cnblogs.com/wmqiang/p/10557570.html