当前位置: 代码迷 >> 综合 >> 你真的理解了this关键字了么?
  详细解决方案

你真的理解了this关键字了么?

热度:93   发布时间:2023-09-28 07:17:05.0

初学java面向对象时,不管书本上还是老师对this的解释都是 指向当前对象。对构造方法成员属性赋初值一定要加 this;于是乎 就有了 this.name = name ......等。后来经过代码的洗礼。this关键字的解释 指向当前对象 真的是精华,言简意赅。后来翻看StringBuilder 的append(String param)方法源码 醍醐灌顶。原来 只有 通过new 关键字 new 出对象时,此时堆内存(也就是内存条上的一块区域)才会开辟一块区域 存放当前new出的对象。当有多个new语句时,也就是在堆内存中有多个this,那就有人疑问了 this不是指向当前对象啊, 对, 这句话this指向当前对象永远没错。多个new时 多个this 也没毛病,但是在这么多个this中,每个this都有一个唯一的身份码。当我们通过栈区引用(栈区引用可理解为 new 类() 的左边 比如 Person p)去调用成员方法时,此时就通过栈区引用找到堆区对应的当前this对象。那什么是栈区,也就是内存条的一块区域。那在代码中怎么知道 栈区引用和堆区对象是什么呢 ,看下面代码

Person person = new Person();
/**左边的 Person person 即为在栈区开辟的引用。他只是个引子。不是太重要,但是没他也不行右边 new Person() 这是主角。他才是对象真正的容身之地 在堆内存中。此时就会有一个带唯一身份码的this标记该区域。由于存在 赋值号 = , 所以 引子[person]就指向了 堆区的 这个身份码的this区域[new Person()]*/

this关键字 是不能出现在 静态代码块 和静态方法中 。因为 静态代码块和静态方法 是优先加载。这个是设计者规定的 无可置疑。

链式编程

  什么是链式编程,顾名思义 就是像链条一样 连起来。那在java中如何实现链式编程,就是要依靠 this 关键字 来实现

StringBuilder 中的 append(String param) 就是这样的一个例子。 下面代码就是一个链式编程的Demo

Class StringLinkDemo{/**存放字符串的List容器*/private List<String> containers = new ArrayList();// getter 方法public List<String> getContainers(){return this.containers;} // setter 方法public void setContainers(String param){this.containers.add(param);}public StringLinkDemo append(String param){this.setContainers(param);return this; // 返回 this即可以实现 链式编程}// 以 字符串形式 返回容器中的字符串public String toString(){String containerString = "[";containers.forEach((item)=>{  //使用 JDK1.8containerString += "\""+item+"\",";}return containerString.substring(containerString.lastIndexOf(",")+1)+"]";) }}

上面代码 如何调用 只需要要 StringLinkDemo stringLinkDemo = new StringLinkDemo();  然后stringLinkDemo.append("111").append("222").append("333") 可以无限 append下去 具体调用 如下

public void static main(String[] args){StringLinkDemo stringLink = new StringLinkDemo();stringLink.append("111").append("222").append("333").append("444").append("555");System.out.println(stringLink);// 输出的结果就是["111","222","333","444","555"]}

:)

 

 

 

 

 

 

 

 

 

 

 

 

  相关解决方案