精华内容
下载资源
问答
  • 要点匿名类的概念和用法语言规范以及语言的横向对比等内存泄漏的切入点总结没有人类认知意义上的名字只能继承一个父类或实现一个接口父类是非静态的类型,则需父类外部实例来初始化如果定义在非静态作用域内,会引用...

    要点

    匿名类的概念和用法

    语言规范以及语言的横向对比等

    内存泄漏的切入点

    总结

    没有人类认知意义上的名字

    只能继承一个父类或实现一个接口

    父类是非静态的类型,则需父类外部实例来初始化

    如果定义在非静态作用域内,会引用外部类实例

    只能捕获外部作用域内的final变量

    创建时只有单一方法的接口可以用Lambda转换

    a.匿名内部类的名字

    表面上是没有引用名的,

    但其实是有用于定位的“名字”,

    3778621348ed如上代码,

    new Foo()在定义的时候,

    重写了bar()这个方法,

    如此一来new Foo(){...}这里就是一个匿名内部类了;

    呐这个匿名内部类,实际上在字节码中是会定义出来的,!!!

    定义出来一个用于定位的“名字”,

    这个“名字”可见上面代码的第二行,

    “com.bennyhuo.iiv.ch1.”即代码包名,

    “OuterClass$1”即外部内名$1,

    1代表这个匿名内部类,

    是前缀的外部类中,定义的第一个匿名内部类,

    再创建第二个匿名内部类 就是$2了;

    所以匿名内部类跟普通类一样,是可以加载出来的!!!

    只不过参数格式不一样,

    普通类是“class 类名”

    匿名内部类是“class 包名.外部类名$num”

    3778621348ed

    b.匿名内部类的继承结构

    匿名内部类被创建的时候,

    就默认 匿名内部类 是作为一个子类

    去继承其对应的父类了:(接口亦同)

    3778621348ed

    但是下面这种类型,

    既 继承某个父类 又 实现某个接口 的“匿名内部类” 的 这种类型,

    在Java中是不被接受的,

    因为这其实是一种“或类型”,

    即Runnable或上Foo的结果,作为一种类,

    这在Java中是不被接受的:

    3778621348ed

    **即使使用Java 10 的var关键字来定义,

    只能继承一个父类或实现一个接口

    >- 父类是非静态的类型,则需父类外部实例来初始化

    >- 如果定义在非静态作用域内,会引用外部类实例

    >- 只能捕获外部作用域内的final变量

    >- 创建时只有单一方法的接口可以用Lambda转换

    ####a.匿名内部类的名字

    表面上是没有引用名的,

    但其实是有用于定位的“名字”,

    3778621348ed

    如上代码,

    new Foo()在定义的时候,

    重写了bar()这个方法,

    如此一来new Foo(){...}这里就是一个匿名内部类了;

    呐这个匿名内部类,实际上在字节码中是会定义出来的,!!!

    定义出来一个用于定位的“名字”,

    这个“名字”可见上面代码的第二行,

    “com.bennyhuo.iiv.ch1.”即代码包名,

    “OuterClass$1”即外部内名$1,

    1代表这个匿名内部类,

    是前缀的外部类中,定义的第一个匿名内部类,

    再创建第二个匿名内部类 就是$2了;

    所以匿名内部类跟普通类一样,是可以加载出来的!!!

    只不过参数格式不一样,

    普通类是“class 类名”

    匿名内部类是“class 包名.外部类名$num”

    3778621348ed

    ####b.匿名内部类的继承结构

    - 匿名内部类被创建的时候,

    就默认 匿名内部类 是作为一个子类

    去继承其对应的父类了:(接口亦同)

    3778621348ed

    - 但是下面这种类型,

    既 继承某个父类 又 实现某个接口 的“匿名内部类” 的 这种类型,

    在Java中是不被接受的,

    因为这其实是一种“或类型”,

    即Runnable或上Foo的结果,作为一种类,

    这在Java中是不被接受的:

    >>

    3778621348ed

    3778621348ed

    嗯,

    可是如果实在是想实现一个

    如既 继承某个父类 又 实现某个接口 的“匿名内部类”这样的类型,

    但要不想占用太多资源,要求同匿名内部类一样用完即销毁,怎么办?

    那别用匿名内部类呗,

    在方法体内部实现即可,!!!

    便可以在方法调用完毕后将其回收,

    也可以达到需求:

    3778621348ed

    另外,Kotlin是可以实现,

    既 继承某个父类 又 实现某个接口 的“匿名内部类” 的 这种类型的:

    (object类似于class与定义一个引用,

    object与后面冒号之间不接名字表示匿名,

    冒号后面要继承什么,实现什么,直接写出来就是了)

    3778621348ed

    c.匿名内部类的构造方法(关注:匿名内部类对外部类的引用)

    匿名内部类会有外部类的引用,

    这个可能导致内存泄漏!

    匿名内部类的构造方法是 编译器 帮忙定义的!!!

    开发者没有权 定义匿名内部类的构造方法;

    编译器 会 根据代码 为 匿名内部类的构造方法 引入一些参数,

    如下面图中例子,

    (右上)有一个OuterClass,里边有一个InnerClass,

    (左上)这时候在Client类中,

    new出来一个匿名内部类,

    匿名内部类——父类非静态、所在方法(匿`类被new出来的位置所处的方法)非静态

    例子中这个new出来的匿名内部类,

    实际上它的父类就是InnerClass,

    而InnerClass本身是一个非静态的内部类,

    !!!!!非静态的内部类本身就会引用外部类的实例!!!!!!,

    所以OuterClass()的实例也会在这里(左上第四行)new出来;

    而下方的Client$1就是上述所说的匿名内部类的类型了,

    Client$1的命名格式其实就是刚刚说的外部内名$匿名内部类序号;

    所以图中下方代码块的第二行,

    即编译器 根据代码 为 匿名内部类生成的构造方法,

    其第一个参数,就是Client,即匿名内部类所在方法 对应的 外部作用域(最外部类);

    因为这里的匿名内部类所在的方法 是非静态方法,

    所以一定是被某个实例(最外部类实例) 引用着的!!!!!

    其第二个参数,即匿名内部类的父类,

    这个父类如果是某外部类的非静态内部类,

    那把这个对应的外部类实例传进来即可,

    因为这个外部类实例可以应用到其成员(包括非静态内部类);

    3778621348ed

    匿名内部类——父类静态、所在方法非静态

    interface跟静态内部类的效果是差不多的,

    就是静态的,

    也就是不会去引用其外部类的实例!!!!!

    所以这时候匿名内部类的构造方法的参数

    就只有一个所在方法的最外部类实例了;

    3778621348ed

    匿名内部类--父类静态、所在方法静态

    而,当匿名内部类所在的方法是静态的,

    则其构造方法的参数中,

    不存在所在方法的最外部类实例了;

    3778621348ed

    即,

    匿名内部类的构造方法的参数个数,

    由其父类以及其所在方法 是否静态决定,

    父类非静态,则需传入父类相关实例;

    所在方法非静态,则需传入所在方法的最外部类实例;

    反则,

    哪个静态了,就不用传哪个;

    00 01 10 11

    捕获 匿名内部类 所在方法内(外部作用域) 的 局部变量快照的情况

    匿名内部类重写父类方法时,引用到的外部方法体内的局部final变量

    通常,要求要被捕获的局部变量 需要是final修饰的;

    虽然说如果不final的话,

    对匿名内部类的构造方法也不是很有影响,

    因为传给匿名内部类构造方法的这个局部变量实例,

    实际上只是捕获局部变量实例的一个快照,

    快照即复制一份引用,给匿名内部类的构造方法去使用,

    但是,

    如果这个局部变量实例不是final的,

    那局部变量实例被重新赋值了,

    外部的局部变量实例跟传给匿名内部类构造方法的局部变量实例,就不一样了!

    这个肯定是不行的吧,

    所以,

    Java要求,

    这个地方(图中左边,第三行,也即被传给 匿' 构造方法 的这个 局部实例)一定要是final的,

    原因就是为了让这个局部变量实例,在外部和在 匿’ 构造方法 中,

    给保持一致!

    3778621348ed

    匿名内部类的构造方法小结

    是编译器生成的

    参数列表包括

    外部对象(定义在非静态域内)

    父类的外部对象(父类非静态)

    父类的构造方法参数(父类有构造方法且参数列表不为空)

    外部捕获的变量(方法体内有引用外部final变量)

    事实上是可以通过反射,

    去修改匿名内部类的构造方法持有的外部引用(参数列表)的

    Lambda转换(SAM转换)

    SAM--single abstract method 单一方法类型

    3778621348ed

    3778621348ed

    一个接口,只有一个抽象方法时,可以用Lambda表达式替换实现;

    关注语言版本的变化

    体现对技术的热情

    体现好学的品质

    显得专业

    展开全文
  • 通过此练习了解了线程中run()...线程中没有带参数的run方法(如果想要实现带参数的run方法:1、定义线程内变量2、在继承thread的时候,增加带参数的构造函数,初始化线程内变量3、在run方法操作线程内变量,以达到...
    通过此练习了解了线程中run()方法没有参数如何传参。

     

    可以看出程序使用了匿名内部类。

     

    尝试一:
    以为不就是把Helper类extendsThread每次创建一个它然后启动吗。
    碰到瓶颈1:
    线程中没有带参数的run方法(如果想要实现带参数的run方法:1、定义线程内变量2、在继承thread的时候,增加带参数的构造函数,初始化线程内变量3、在run方法操作线程内变量,以达到类似传参的效果)

    解决一下:

    添加一个要用到的这两个变量,就ok了,
    但最好再加一个Helper类型的变量,以为实际也只创建了一个helper在多线程中使用。(就变成标准答案啦)
    过程中的误区1:
    以为在request方法里面创建的线程会随着这个方法的结束而消亡,其实不会,怎么可能会呢。
    标准答案二:
    将helperThread声明为非匿名的内部类:

     

    转载于:https://www.cnblogs.com/wzdnwyyu/p/11162934.html

    展开全文
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    学生提问:既然内部是外部的成员,是否可以为外部类定义子类,在子类中再定义一个内部来重写其父中的内部? 211 6.7.4 局部内部 211 6.7.5 匿名内部 212 6.7.6 闭包(Closure)和回调 215 6.8 ...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,... Object 定义的,因此所有的都继承了它。子类覆盖 finalize() ...
  • 10.2.3 记得给一个无参数的构造方法 255 10.2.4 调用父类中的构造方法 256 10.2.5 对象也会“变脸” 258 10.2.6 遵守语法,正确“变脸” 262 10.3 覆盖——与继承如影随形 264 10.3.1 当方法不再通用 264 ...
  • 10.2.3 记得给一个无参数的构造方法 255 10.2.4 调用父类中的构造方法 256 10.2.5 对象也会“变脸” 258 10.2.6 遵守语法,正确“变脸” 262 10.3 覆盖——与继承如影随形 264 10.3.1 当方法不再通用 264 ...
  • 10.2.3 记得给一个无参数的构造方法 255 10.2.4 调用父类中的构造方法 256 10.2.5 对象也会“变脸” 258 10.2.6 遵守语法,正确“变脸” 262 10.3 覆盖——与继承如影随形 264 10.3.1 当方法不再通用 264 ...
  • 派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装:  封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,...
  • java 面试题 总结

    2009-09-16 08:45:34
    派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即...
  • java面试宝典

    2013-02-28 16:04:01
    45、内部类可以引用他包含类的成员吗?有没有什么限制? 12 46、java 中实现多态的机制是什么? 12 47、在java 中一个类被声明为final 类型,表示了什么意思? 12 48、下面哪些类可以被继承? 12 49、指出下面程序的...
  • 千方百计笔试题大全

    2011-11-30 21:58:33
    45、内部类可以引用他包含类的成员吗?有没有什么限制? 12 46、java 中实现多态的机制是什么? 12 47、在java 中一个类被声明为final 类型,表示了什么意思? 12 48、下面哪些类可以被继承? 12 49、指出下面程序的...
  • 6.3 、对象和成员的使用方法及区别 56 6.3.1 声明一个 56 6.3.2 命名习惯 57 6.3.3 定义一个对象 57 6.3.4 与对象的区别 57 6.3.5 对象与成员的关系 57 6.3.6 不要给赋值 58 6.3.7 对象只能调用中...
  • C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义方法。 【面试题库网整理 .net 面试题(附答案)(三)】 22.您要创建一个显示公司员工列表的应用程序。您使用一个...
  • Visual C++ 2008入门经典--详细书签版

    热门讨论 2013-02-02 16:07:15
    7.11.3 定义引用类型的复制构造函数 335 7.11.4 属性 336 7.11.5 initonly字段 348 7.11.6 静态构造函数 349 7.12 小结 350 7.13 练习 351 第8章 深入理解 352 8.1 的析构函数 352 8.1.1 析构函数的...
  • 7.11.3 定义引用类型的复制构造函数 335 7.11.4 属性 336 7.11.5 initonly字段 348 7.11.6 静态构造函数 349 7.12 小结 350 7.13 练习 351 第8章 深入理解 352 8.1 的析构函数 352 8.1.1 析构函数的...
  • java面试题典 java 面试题 经典

    热门讨论 2010-06-18 13:42:36
    54. 内部类可以引用他包含类的成员吗?有没有什么限制? 17 二、 JAVA高级(servlet 、ejb、 线程、J2EE) 17 1. 说出Servlet的生命周期,并说出Servlet和CGI的区别 17 2. EJB是基于哪些技术实现的?并说出Session...
  • 30、内部类可以引用它的包含类的成员吗?有没有什么限制? 21 31、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 33、数字转字符有多少种方式,...
  • java基础题 很全面

    2009-05-09 09:24:24
    71. 内部类可以引用他包含类的成员吗?有没有什么限制? 15 J2EE 15 1. JSP的内置对象及方法。 15 2. JSP的常用指令 16 3. Request对象的主要方法: 16 4. jsp有哪些动作?作用分别是什么? 16 5. JSP中动态INCLUDE与...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 29、super.getClass()方法调用 ...
  • java面试题

    2018-01-01 15:35:15
    29. Anonymous Inner Class (匿名内部) 是否可以extends(继承)其它,是否可以implements(实现)interface(接口)? 15 30. 构造器Constructor是否可被override 15 31. try {}里有一个return语句,那么紧跟在这个try...
  • 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 29、super.getClass()方法调用 ...
  • Java面试宝典2010版

    2011-06-27 09:48:27
    27、内部类可以引用它的包含类的成员吗?有没有什么限制? 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 29、super.getClass()方法调用 30、...
  • 可以用list()或者array()来定义它们,也可以直接为数组赋值。数组的索引从0开始。虽然我在这里没有说明,但是你一样可以轻易的使用多维数组。 // 一个包含两个元素的数组 $a[0] = "first"; $a[1]...
  • 创建数组可以使用构造函数的方式也可以使用字面量的形式,另外可以使用concat从一个数组中复制一个副本出来。数组本身提供了很多方法让开发者使用来操作数组。 - length 数组的长度 - toString 可以返回一个以...
  • Java 面试宝典

    2013-02-01 10:02:08
    27、内部类可以引用它的包含类的成员吗?有没有什么限制? ............................. 21 28、Anonymous Inner Class (匿名内部类) 是否可以 extends(继承)其它类,是否可 以 implements(实现)interface(接口)?...

空空如也

空空如也

1 2
收藏数 25
精华内容 10
关键字:

匿名类可以定义构造方法吗