匿名内部类 this.val$的问题

匿名内部类 this.val$的问题 - KILLER0410

一天偶尔在网上找到一个jar包,反编译后出现了如下的代码:

public void defineAnonymousInnerClass( String name ) 
  { 
    new Thread( name ) {  //extra constructor argument "name" 
      public void run() { 
        System.out.println( this.val$ name); //"this.val$"  is extra 
      } 
    } 
    .start(); 
  }

当看到红色的部分时,我就纠结了。这是什么东西还能这么使用?后来在百度上搜索答案,却始终不得答案。最终在google找到了答案。

      链接地址:http://www.mindfiresolutions.com/A-tip-on-val$-field-in-Java-decompiled-code-1725.php

   其实,我是被编译器给玩了。这些代码都是编译器反编译的时候自己添加上去的。

第一个问题:匿名内部类要使用外面的参数,必须要加final。而代码中却没有加。

第二个问题:new Thread 这个类没有带参数的构造器。

第三个问题:this.val$这种用法很怪异,val$是哪里来的。

这些问题都是反编译器给我们搞的鬼。

我们在学习匿名内部类的时候都知道,匿名内部类要使用外部的变量,或者参数,这个变量和参数都必须是final类型。而且匿名内部类没有构造器他的构造器是继承于父类,这就还有一个问题就是那我们如何初始化内名内部类中的变量,只需要使用“{}”在里面初始化变量不需要任何修饰。再就是在匿名内部类中this表示当前对象,如果要使用外部类对象需要加上Outclass.this这才是外部对象。

所以以上代码我们做如下修改:

public void defineAnonymousInnerClass( final String name )//参数加上final 
  { 
    new Thread() {  // 额外的参数去掉 
      public void run() { 
        System.out.println(name); //" this.val$"  多余的去掉 
      } 
    } 
    .start(); 
  }

这时我们就可以正常运行了,其实都是编译器搞的鬼。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化这段代码 this.$set(this.locationData[0],'val',this.mediumData[4].info[0].val)//总调度室 this.$set(this.locationData[1],'val',this.mediumData[1].info[2].val)//矿山事业部 this.$set(this.locationData[2],'val',this.mediumData[2].info[0].val)//钾事业部 this.$set(this.locationData[3],'val',this.mediumData[2].childCenterCost[0].info[0].val)//选矿工段 this.$set(this.locationData[4],'val',this.mediumData[2].childCenterCost[2].info[0].val)//尾盐工段 this.$set(this.locationData[5],'val',this.mediumData[2].childCenterCost[1].info[0].val)//干包工段 this.$set(this.locationData[6],'val',this.mediumData[0].childCenterCost[0].info[0].val)//供水工段 this.$set(this.locationData[7],'val',this.mediumData[0].info[0].val)//设备能源部 this.$set(this.locationData[8],'val',this.mediumData1.info[0].val)//五矿盐湖 this.$set(this.locationData[9],'val',this.mediumData[0].childCenterCost[1].info[0].val)//供电工段 this.$set(this.locationData[10],'val',this.mediumData[5].info[0].val)//质检中心 this.$set(this.locationData[11],'val',this.mediumData[3].info[0].val)//锂事业部 this.$set(this.locationData[12],'val',this.mediumData[3].childCenterCost[4].info[0].val)//母液工段 this.$set(this.locationData[13],'val',this.mediumData[3].childCenterCost[3].info[0].val)//沉锂工段 this.$set(this.locationData[14],'val',this.mediumData[3].childCenterCost[2].info[0].val)//预处理工段 this.$set(this.locationData[15],'val',this.mediumData[3].childCenterCost[0].info[0].val)//吸附工段 this.$set(this.locationData[16],'val',this.mediumData[3].childCenterCost[1].info[0].val)//中试工段
最新发布
05-31

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值