首页 / JAVA / Java之匿名类讲解
Java之匿名类讲解
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java之匿名类讲解,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2472字,纯文字阅读大概需要4分钟。
内容图文
![Java之匿名类讲解](/upload/InfoBanner/zyjiaocheng/1112/06e4914cf44e49c39be1ea2003520820.jpg)
参考https://blog.csdn.net/jiaotuwoaini/article/details/51542059
匿名类,正如名字一样在java中没有名字标识的类,当然了编译后还是会安排一个名字的。
下面是一个关于匿名类的简单例子:
public class Client { public static void main(String[] args) throws InterruptedException { Thread t=new Thread(new Runnable() { @Override publicvoid run() { System.out.println("hello,dusk!"); } }); t.start(); } }
Java语言规范上是这么描述匿名类的:
匿名类的声明:
匿名类的声明是由java编译器自动派生自一个类实例创建表达式。
匿名类永远不能是抽象的。
匿名类总是隐式的final。
匿名类总是一个内部类;并且不能是static的。
匿名构造函数:
匿名类不能有显式声明的构造函数。相反的,Java编译器必须为这个匿名类自动提供一个匿名构造函数。匿名类C继承于父类S那么匿名构造函数是下面的形式:
- 如果S不是一个内部类或者S是一个静态上下文中的局部类,那么这个匿名构造函数有一个形参为每一个在C的类实例创建表达式中的实际参数。
类的实例创建表达式的实际参数用来确定S的一个构造函数cs,使用方法调用相同的规则。
每一个匿名构造函数的形参必须和cs中的相关形参一致。
这个构造函数中显式的包括super(...)构造函数调用,这个实际参数是构造函数的形参,按它们声明的顺序。
- 否则,C的构造函数第一个形参描述了这个值,直接包围实例i相对于S。参数的类型是S的class类型。
构造函数有一个额外的形参为每一个类实例创建语句声明在匿名类中的实际参数。第n个形参和第n-1个实际参数相关。
类的实例创建表达式的实际参数用来确定S的一个构造函数cs,使用方法调用相同的规则。
每一个匿名构造函数的形参必须和cs中的相关形参一致。
这个构造函数中显式的包括super(...)构造函数调用,这个实际参数是构造函数的形参,按它们声明的顺序。
在所有的情况下,匿名构造函数的throws语句必须列出所有的检查异常,包括父类构造函数显式调用语句抛出的和匿名类的实例初始化或者变量初始化抛出的异常。
注意:匿名构造函数的签名涉及到了一个不可达类型是可能的(例如,出现在父类构造函数中的类型),这不会导致任何编译时和运行时错误。
实际使用中我们只需注意这几点儿:
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
2、匿名内部类中是不能定义构造函数的。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
编译时的命名规则:
- 内部类的class文件命名是:主类+$+内部类名
- 匿名类的class文件命名是:主类+$+(1,2,3....)
定义一个场景:
package com.dusk.anonymous; public class AnonymousClassTest { private Runnable r1=new Runnable() { @Override publicvoid run() { System.out.println(1); } }; publicvoid method1(){ Runnable r2=new Runnable() { @Override publicvoid run() { System.out.println(2); } }; } publicstaticvoid main(String[] args) { Runnable r3=new Runnable() { @Override publicvoid run() { System.out.println(3); } }; } }
从代码中我们可以看出定义了三个匿名类:
我们反编译出来:
package com.dusk.anonymous; import java.io.PrintStream; class AnonymousClassTest$1 implements Runnable { AnonymousClassTest$1(AnonymousClassTest paramAnonymousClassTest) {} publicvoid run() { System.out.println(1); } } package com.dusk.anonymous; import java.io.PrintStream; class AnonymousClassTest$2 implements Runnable { AnonymousClassTest$2(AnonymousClassTest paramAnonymousClassTest) {} publicvoid run() { System.out.println(2); } } package com.dusk.anonymous; import java.io.PrintStream; class AnonymousClassTest$3 implements Runnable { publicvoid run() { System.out.println(3); } }
原文:https://www.cnblogs.com/lijingran/p/9095652.html
内容总结
以上是互联网集市为您收集整理的Java之匿名类讲解全部内容,希望文章能够帮你解决Java之匿名类讲解所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。