java 匿名类型_Java之匿名类讲解
匿名类,正如名字一样在java中没有名字标识的类,当然了编译后还是会安排一个名字的。
下面是一个关于匿名类的简单例子:
public classClient {public static voidmain(String[] args) throws InterruptedException {
Thread t=new Thread(newRunnable() {
@Overridepublic voidrun() {
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 classAnonymousClassTest {private Runnable r1=newRunnable() {
@Overridepublic voidrun() {
System.out.println(1);
}
};public voidmethod1(){
Runnable r2=newRunnable() {
@Overridepublic voidrun() {
System.out.println(2);
}
};
}public static voidmain(String[] args) {
Runnable r3=newRunnable() {
@Overridepublic voidrun() {
System.out.println(3);
}
};
}
}
从代码中我们可以看出定义了三个匿名类:
我们反编译出来:
package com.dusk.anonymous;
import java.io.PrintStream;class AnonymousClassTest$1implements Runnable
{
AnonymousClassTest$1(AnonymousClassTest paramAnonymousClassTest) {}public voidrun()
{
System.out.println(1);
}
}
package com.dusk.anonymous;
import java.io.PrintStream;class AnonymousClassTest$2implements Runnable
{
AnonymousClassTest$2(AnonymousClassTest paramAnonymousClassTest) {}public voidrun()
{
System.out.println(2);
}
}
package com.dusk.anonymous;
import java.io.PrintStream;class AnonymousClassTest$3implements Runnable
{public voidrun()
{
System.out.println(3);
}
}
我们可以看出匿名类的名字中的数字和他们在代码中出现的位置一模一样。
java 匿名类型_Java之匿名类讲解相关推荐
- java调用自己写的类型_Java基础——自定义类的使用
自定义类 我们可以把类分为两种: 1.一种是java中已经定义好的类,如之前用过的Scanner类.Random类,这些我们直接拿过来用就可以了. 2.另一种是需要我们自己去定义的类,我们可以在类中定 ...
- java判断类型_Java中类型判断的几种方式 - 码农小胖哥 - 博客园
1. 前言 在Java这种强类型语言中类型转换.类型判断是经常遇到的.今天就细数一下Java中类型判断的方法方式. 2. instanceof instanceof是Java的一个运算符,用来判断一个 ...
- java注解类型_Java注解类型
本篇文章帮大家学习java注解类型,包含了Java注解类型使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 标记注解类型 标记注解类型是没有元素的注解类型,甚至没有默认值. ...
- java记录类型_Java中的记录类型
java记录类型 于2020年3月发布的JDK 14引入了记录 (预览语言功能),该记录提供了一种紧凑的语法来声明主要用于保存数据的类. 在记录中 ,所有低级,重复且容易出错的代码都类似于构造函数,访 ...
- java注释类型_Java 8类型注释
java注释类型 Lambda表达式是迄今为止Java 8讨论最多和最受促进的功能.虽然我同意Lambda是一个很大的改进,但我认为其他一些Java 8功能由于Lambda的炒作而有所欠缺. 在这篇文 ...
- java 判断类型_Java中类型判断的几种方式
在Java这种强类型语言中类型转换.类型判断是经常遇到的.今天就细数一下Java中类型判断的方法方式.拉勾IT课小编为大家提供java种类型判断方式. instanceof instanceof是Ja ...
- java 正整数类型_Java 整数类型
Java教程 - Java整数类型 Java字节类型 最小的整数类型为byte.byte类型变量在使用来自网络或文件的数据流时非常有用. 字节变量通过使用byte关键字声明.下面声明两个字节变量b和c ...
- java 判断类型_Java变量类型识别的3种方式
变量类型识别有3种方法: 通过反射拿到变量的类型 instanceof关键字判断 通过java的多态(方法重载)来DIY类型识别 具体看例子吧,尤其第三种方式 有一个自定义的TypeTools,我觉得 ...
- java 变量类型_Java 变量类型
Java 变量类型 在Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下: type identifier [ = value][, identifier [= value] ...] ...
最新文章
- 动手造轮子:基于 Redis 实现 EventBus
- c语言贪吃蛇最简单代码_C语言指针,这可能是史上最干最全的讲解啦(附代码)!!!...
- 华为云Volcano:让企业AI算力像火山一样爆发
- java 图像边界识别_图像识别原理之如何识别图像边缘
- keil uvisoin软件出现闪退和打开工程以前添加的c文件上面出现黄色感叹号
- 分布式缓存产品Redis和memcached比较区别(图)
- Dart集成开发环境
- 【最佳实践】【Blend】Triggers、Actions 和 Behaviors
- 二分查找 —— 从三分支到二分支
- 监控web状态的脚本
- 高质量病毒——暴风一号(BoyFine)代码.vbs
- 苹果错误分析报告preferreuserinterface_20182019年苹果产业链分析报告
- 转载-信息化与系统集成技术-全面解析工业4-0和云计算、大数据
- 云计算会不会被边缘计算取而代之
- GBASE 8s UDR内存管理_02_mi_dalloc
- python 弧度制和角度制相互转换(math库和numpy库);计算反正余弦正切值
- Pandas数据分析 - 去重 - duplicated() drop_duplicates() 用法
- DRUCK德鲁克压力校验仪维修DPI620G-IS
- Greenplum实战-gpstop gpstart集群命令
- 一天一天学做外挂@第三天-实现人物飞天效果[武林外传]
热门文章
- QT5动态创建多个按钮控件并关联信号槽函数
- pandas无法打开.xlsx文件,xlrd.biffh.XLRDError: Excel xlsx file; not supported
- 数据封装以及解封的过程
- python中的try与if,python中if和try的区别是什么
- mysql表还原初始状态_workbench 怎么恢复初始设置
- 2020年秋计算机科学导论,南开大学《主干课1-计算机科学导论》2020秋主干课考试...
- Win10提示不是有效的字体文件怎么解决
- win7纯净版系统锁定系统时间的设置方法
- Win11系统无法安装GPT分区的解决方法
- 钉钉电脑版怎么创建共享文件 钉钉文件共享的方法