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这个方法;