java内部类、匿名类原本以为它们的使用已经很滑, 成绩, 就在昨天晚上12指向时钟发生重大事故。事故的严重程度再说吧,那是因为我没有睡一晚睡眠。

那以下先用一段模拟代码来描写叙述下我出现的问题的:

public class Test {public static void main(String[] args) throws InterruptedException {View v = new View();v.show(1);Thread.sleep(500);v.mTextView.execute();Thread.sleep(1000);v.show(2);Thread.sleep(500);v.mTextView.execute();}
}class View {public TextView mTextView;public void show(int position) {if(mTextView == null) {mTextView = new TextView();mTextView.setListener(new Listener() {@Overridepublic void click() {System.out.println("position = " + position);}});}mTextView.show();}
}class TextView {private Listener mListener;public void setListener(Listener l) {mListener = l;}public void execute() {mListener.click();}public void show() {System.out.println("textview show...");}
}interface Listener {public void click();
}

不出意外的话。 console肯定是打印的1  2。 可是偏偏就在这困扰到我了。打印的结果是1  1, 细致顺一下代码,我们就应该去思考这个匿名内部类究竟是怎么使用的外部类那个方法的參数的。

从打印的结果上看, 我猜想肯定是在这个内部类的实例中保存了position參数。那带着这个猜想。我们来debug一下程序。

这是第一次运行到的时候, 发现什么问题了吗。

在mListener中居然有一个和position相关的变量。到这里,我们感觉那个推測可能是正确的。再往下思考,既然在mListener对象中保存了这个变量,那么下次运行到,同一个对象。所以变量肯定是同样的,这样也就解开我们的疑惑了。

总结一下:

在我们new一个匿名内部类的时候,假设使用了方法中的东西,那么jvm会给我们的匿名类加一个构造方法,而且将这个參数传递进来,比如上面的样例中:

class View$Listener {public View$Listener(int position) {this.Listener$position = position;}public void click() {...}
}

既然知道了这些。那么我们的疑惑也就解开了, 那上面的问题怎么解决呢? 事实上我们非常早之前就已经知道解决方法了,想想android中自己定义Adapter的getView()方法。你会恍然大悟。上面的问题怎么解决呢?就是把setListener放到if后面,而不是里面。

public class Test {public static void main(String[] args) throws InterruptedException {View v = new View();v.show(1);Thread.sleep(500);v.mTextView.execute();Thread.sleep(1000);v.show(2);Thread.sleep(500);v.mTextView.execute();}
}class View {public TextView mTextView;public void show(int position) {if(mTextView == null) {mTextView = new TextView();
//          mTextView.setListener(new Listener() {
//              @Override
//              public void click() {
//                  System.out.println("position = " + position);
//              }
//          });}mTextView.setListener(new Listener() {@Overridepublic void click() {System.out.println("position = " + position);}});mTextView.show();}
}class TextView {private Listener mListener;public void setListener(Listener l) {mListener = l;}public void execute() {mListener.click();}public void show() {System.out.println("textview show...");}
}interface Listener {public void click();
}

这样在每次调用show方法时,都会又一次new一个Listener内部类。

版权声明:本文来源于Loader's Blog。博客,未经同意不得转载。

从一开始,说出事java匿名内部类相关推荐

  1. java 匿名内部类 百科_java匿名内部类具体概念是什么,在什么地方用到?

    展开全部 java匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们e69da5e887aa62616964757a686964616f313333376138 ...

  2. Java匿名内部类里为什么能用外部变量

    2019独角兽企业重金招聘Python工程师标准>>> 偶然间想到一个问题,Java匿名内部类里为什么能用外部变量?Java到底在背后做了什么呢: final List<Int ...

  3. 关于JAVA匿名内部类,回调,事件模式的一点讨论

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 关于JA ...

  4. 去除残缺条目java_为什么说Java匿名内部类是残缺的闭包

    为什么说Java匿名内部类是残缺的闭包 https://blog.csdn.net/hzy38324/article/details/77986095 前言 我们先来看一道很简单的小题: public ...

  5. java匿名内部类,什么是匿名内部类,如何定义匿名内部类,如何使用匿名内部类?

    java匿名内部类 什么是匿名内部类? 匿名内部类的使用场景? 匿名内部类如何创建? 匿名内部类的实现和使用 例1(实现接口) 例2(继承类) 什么是匿名内部类? 匿名内部类,顾名思义,就是不知道这个 ...

  6. Java匿名内部类的用法(简单教学)

    Java匿名内部类笔记 public class Test{public static void main(String[] args){/*语法*///Coo o1 = new Coo(); //创 ...

  7. 为什么说Java匿名内部类是残缺的闭包

    为什么说Java匿名内部类是残缺的闭包 https://blog.csdn.net/hzy38324/article/details/77986095 前言 我们先来看一道很简单的小题: public ...

  8. java 匿名内部类 参数_Java匿名内部类原理与用法详解

    本文实例讲述了Java匿名内部类原理与用法.分享给大家供大家参考,具体如下: 一 点睛 匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下: new 父类构造器(实参列表) | 实 ...

  9. Java匿名内部类和Lambda表达式

    Java匿名内部类和Lambda表达式 一.Java匿名内部类 二.JavaLambda表达式 全部代码: 代码运行结果: 一.Java匿名内部类 我们在使用匿名内部类时,需要记住以下几个重要的知识点 ...

最新文章

  1. Linux命令学习记录(六)
  2. 在Mac中安装opencv-python
  3. ubuntu 安装 postgres
  4. linux的系统移植——序言
  5. Windows下MySQL压缩包.zip的安装
  6. 十四、数据库设计三范式
  7. Java怎么去最高分最低分,深入java虚拟机:原子操作ParkEvent和Parker
  8. python os write_Python os.write() 方法
  9. 旋转数组的最小数字(牛客网C++代码)
  10. win10与手机局域网内快速传输文件(免安装软件)
  11. java读文件写文件
  12. 笔记本电脑不用软件开wifi热点
  13. 全球家务机器人发展现状及未来趋势
  14. 1114:白细胞计数(C++)
  15. python科学计数法的显示与转换
  16. MATLAB中删除矩阵的某些列或某些行
  17. ANSJ调用word2vec model文件
  18. Day10QRadiobutton2021-09-24
  19. 各种风格简洁单页响应式html5模板_简洁 响应式 单页 跳转 设计 案例 源码340多套订餐企业模板高大尚响应式网站模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响
  20. java中 如果类c_Java中,如果类C是类B的子类,类B是类A的子类,那么下面描述正确的是( )。_学小易找答案...

热门文章

  1. 不会编程没关系,有了这个“Excel”,零基础上手生成网络
  2. 官方钦定TensorFlow2.0要改这个API,用户吐槽:全世界都是keras
  3. 明略数据(现在)是一家怎样的公司?
  4. Xamarin自定义布局系列——PivotPage(多页面切换控件)
  5. 解决 npm 无法安装 devDependencies 下的依赖包的问题
  6. Java面向对象(继承、抽象类)
  7. 判断两个日期相差的天数
  8. 修改 javascript 中alert样式
  9. ArcGIS for qml -添加自由文本
  10. 史上最详细的JNI入门教程HelloNative