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

初学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.8
            containerString += "\""+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"]




}

:)

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值