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

java中的神奇"this"的更多相关文章

  1. 深入Java核心 Java中多态的实现机制(1)

    在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...

  2. java中实现多态的机制是什么?

    多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...

  3. java中paint repaint update 之间的关系

    最近总结了一下java中的paint,repaint和updata三者之间的关系,首先咱们都知道用paint方法来绘图,用repaint重绘,用update来写双缓冲.但是他们之间是怎么来调用的呢,咱 ...

  4. Groovy中那些神奇注解之InheritConstructors

    上一篇:Groovy中那些神奇注解之ToString 写完ToString,本来想今天就写到这了,突然觉得InheritConstructors注解实在也是个神器,写起来也没多少字,还是写了吧. In ...

  5. Groovy中那些神奇注解之ToString

    继续上一篇:Groovy中那些神奇注解之Memoized 这篇就讲讲@groovy.transform.ToString这个注解,这注解太熟悉了,熟悉到让人一看就知道是干吗的,不就是把Bean转在St ...

  6. java中接口之间的继承

    最近在读一些源码的时候突然发现了一个很神奇的东西,它的原始形态是这样的: 在这行代码中,BlockingDeque.BlockingQueue和Deque是三个接口.刚发现这个问题时,我是十分吃惊的, ...

  7. Java中反射与常用方法

    java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理.   如何获得Class ...

  8. Java中的二进制及基本的位运算

    Java中的二进制及基本的位运算 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二 ...

  9. 如何在Java中避免equals方法的隐藏陷阱

    摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ...

随机推荐

  1. python-面向对象-03_面向对象基础语法

    面向对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的 ...

  2. EOS account 中的 Threshold 和 weight 使用

    https://eoscity.io/f/viewtopic.php?f=7&t=17 这篇文章的原文:   (https://steemit.com/eos/@genereos/eos-mu ...

  3. golang 中创建daemon的方法

    https://github.com/takama/daemon https://github.com/immortal/immortal/blob/master/fork.go            ...

  4. PHP实现装饰器

    参考:https://www.cnblogs.com/onephp/p/6108940.html ●装饰器模式(Decorator),可以动态地添加修改类的功能 ●一个类提供了一项功能,如果要在修改并 ...

  5. [LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal_Medium tag: Tree Traversal

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  6. System.Web.UI.Page的页面基类

    服务器端的page类 所有我们编写的页面都继承自page类,可见page类是非常重要的,page类提供了哪些功能,直接决定了我们的页面类可以继承什么功能,或者说,直接决定了我们的页面类功能的强大与否! ...

  7. CentOS6.5 安装Kafka集群

    1.安装zookeeper 参考文档:http://www.cnblogs.com/hunttown/p/5452138.html 2.下载:https://www.apache.org/dyn/cl ...

  8. selenium PO模式

    思想: 1.定义basepage.py用来写公共方法,比如找元素,打开url,切换frame.这样的部分都写在这里.不必每次用都重写. 2.LoginPage.py 每个功能模块一个文件或者一个类 这 ...

  9. 海量交通大数据应用平台MTDAP_nchang的经验记录

    WRONGTYPE Operation against a key holding the wrong kind of value 根本的就是redis同一个key的value值前后类型不一致,比如最 ...

  10. C++ 执行 cmd 命令 删除文件 删除注册表项

    #include <Windows.h> WinExec("cmd /C \"del C:\\Windows\\secretWin.ini\"",S ...