java val$name_匿名内部类 this.val$的问题
一天偶尔在网上找到一个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();
}
这时我们就可以正常运行了,其实都是编译器搞的鬼。
这是我第一次写博客,如有写的不对的地方请各位大侠们指教。
java val$name_匿名内部类 this.val$的问题相关推荐
- java中的匿名内部类
匿名内部类在java编码中不是很常见,它可一让类实现多继承的特性(多个父类~1个子类) java中的匿名内部类总结 http://www.cnblogs.com/nerxious/archive/20 ...
- Java基础之匿名内部类,匿名内部类是什么?为什么要用匿名内部类,匿名内部类详解。
Java基础之匿名内部类,匿名内部类是什么?为什么要用匿名内部类,匿名内部类详解. 什么是匿名内部类? 顾名思义 匿名 就是没有名字,一个没有名字的内部类,称为匿名内部类. 下面先看一个例子,比如说你 ...
- Java内部类(匿名内部类)
Java内部类(匿名内部类) 一.内部类 二.静态内部类 三.成员内部类 四.局部内部类(了解即可) 五.匿名内部类(重要) 一.内部类 1.概述 内部类就是一个定义在一个类里面的类,里面的类可以理解 ...
- Java内部类和匿名内部类的用法
Java内部类和匿名内部类的用法 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51981163 一.内部类: ...
- Java 匿名类(匿名内部类)
Java 匿名类(匿名内部类) 学习的参考博文:无恨之都 1. 初识 匿名类 标准说法: 内部类包括:成员类.局部类.匿名类(匿名内部类). 匿名类概念: 匿名类可以使你的代码更加简洁 (JDK8之后 ...
- java学习之匿名内部类与包装类
匿名内部类: 所谓匿名内部类,顾名思义指的就是定义在类内部的匿名类,现有的spring框架开发以及java图形界面都经常用到匿名内部类. 下面来看一个代码: interface A{public vo ...
- Java类与匿名内部类
大家好,这篇文章我们主要向大家介绍Java基础中的Object类.匿名内部类.构造方法的继承知识,一起来学习下吧! 一.Object类 Object类是所有类的父类,所有类都继承Object类. Ob ...
- Java静态内部类、匿名内部类、成员式内部类和局部内部类
内部类可以是静态(static)的,可以使用 public.protected 和 private 访问控制符,而外部类只能使用 public,或者默认. 成员式内部类 在外部类内部直接定义(不在方法 ...
- java void eat_java匿名内部类
java匿名内部类一般是没有变量指向的对象,只能使用一次 如下代码,为了使用抽象类People的eat方法还要去继承然后复写eat方式,非常麻烦.对于接口也是如此. package com.lubby ...
最新文章
- 配置国内 Docker Registry Mirror
- JavaMail邮件发送不成功的那些坑人情况及分析说明
- HACMP 认证学习系列,第 2 部分-1:计划与设计
- php实现隐藏字符串的功能
- 理解tcp关闭连接中的time_wait状态
- 5个构建Spring Boot API的实用技巧
- ACM 杰出会员姬水旺:量子化学和物理的深度学习
- java接口可以接两个吗,接口可以在Java中扩展多个接口吗?
- java lambda 变量_java – 从lambda表达式引用的局部变量必须...
- python爬虫爬取网页图片_Python之多线程爬虫抓取网页图片
- zen3 服务器芯片,7nm+工艺Zen3两线出击:EPYC服务器先发 锐龙5000紧跟
- Unity快速安装教程
- diskgenius数据恢复软件,亲测可用!
- 夜神模拟器连不上android studio了
- html 排版标签、文本格式化标签、图像标签、链接标签、注释标签、路径、锚点定位、base文本标签、pre标签、特殊字符
- Python获取当前时间
- 用户分类以及用户活跃度的衡量方法
- 锐捷服务器虚拟化技术_交换机虚拟化技术.ppt
- Ubuntu-安装输入法
- 知识付费APP的崛起