参考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
public void 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
public void run() {
System.out.println();
}
};
public void method1(){
Runnable r2=new Runnable() { @Override
public void run() {
System.out.println();
}
};
}
public static void main(String[] args) {
Runnable r3=new Runnable() { @Override
public void run() {
System.out.println();
}
};
}
}
 

从代码中我们可以看出定义了三个匿名类:

我们反编译出来:

package com.dusk.anonymous;  

import java.io.PrintStream;  

class AnonymousClassTest$
implements Runnable
{
AnonymousClassTest$(AnonymousClassTest paramAnonymousClassTest) {} public void run()
{
System.out.println();
}
} package com.dusk.anonymous; import java.io.PrintStream; class AnonymousClassTest$
implements Runnable
{
AnonymousClassTest$(AnonymousClassTest paramAnonymousClassTest) {} public void run()
{
System.out.println();
}
} package com.dusk.anonymous; import java.io.PrintStream; class AnonymousClassTest$
implements Runnable
{
public void run()
{
System.out.println();
}
}

Java之匿名类讲解的更多相关文章

  1. Java通过匿名类来实现回调函数

    在C语言中,函数名可以当做函数指针传递给形参从而实现回调 void f1() { printf("f1()\n"); } void f2() { printf("f2() ...

  2. 浅谈Java的匿名类

    在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码 ...

  3. java:使用匿名类直接new接口

    java中的匿名类有一个倍儿神奇的用法,见下面代码示例: package contract; public interface ISay { void sayHello(); } 上面是一个简单的接口 ...

  4. java中匿名类的讲解

    匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象 ...

  5. Java中匿名类的两种实现方式(转)

    使用匿名内部类课使代码更加简洁.紧凑,模块化程度更高.内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到.然而这个不是我说的重点,我说的很简单,就是匿名内部类的两种实现方式 ...

  6. java使用匿名类直接new接口

    翻看Vector代码的时候,看到这么一段. /** * Returns an enumeration of the components of this vector. The * returned ...

  7. java中匿名类的注意细节

    abstract class Outer{ int num; public Outer(int x){ num = x; } public abstract void show1(); public ...

  8. JavaScript匿名类整理学习笔记

    以下为总结在开源的JavaScript框架中能看到很多这样语法结构(function(){})()比如我最近看的jQuery,及chediter.刚开始的时候我看到这样的结果有点奇怪,它是怎么执行的, ...

  9. 第四节:详细讲解Java中的类和面向对象思想

    前言 大家好,给大家带来详细讲解Java中的类和面向对象思想的概述,希望你们喜欢 类和面向对象 在Java中怎样理解对象,创建对象和引用:什么是引用,对于基础学习的同学,要深入了解引用.示例:Stri ...

随机推荐

  1. l两张图片轮播

    在head里面加 <script language="javascript"> function scroll(spanlevel) { if (spanlevel.s ...

  2. 时间写入文件名 nohup 原理 Command In Background your shell may have its own version of nohup

    echo 123 > `date +%Y-%m-%d-%H.tmp` echo 123 > /home/`date +%Y-%m-%d-%H.tmp` nohup --help [root ...

  3. python网络爬虫之requests库 二

    前面一篇在介绍request登录CSDN网站的时候,是采用的固定cookie的方式,也就是先通过抓包的方式得到cookie值,然后将cookie值加在发送的数据包中发送到服务器进行认证. 就好比获取如 ...

  4. 怎样拆分View Controller进而实现轻量级的View Controller[UIKit]

    參考文章来自objcio站点   为什么要编写轻量级的View Controller??   1.作为iOS项目中最大的文件,ViewControllers中的代码复用率差点儿是最低的 2.重量级的V ...

  5. CountDownLatch,CyclicBarrier,Semaphore的使用

    什么时候使用CountDownLatch CountDownLatch原理和示例 Semaphore信号量的原理和示例 CyclicBarrier的用法 CyclicBarrier 和 CountDo ...

  6. Java for LeetCode 092 Reverse Linked List II

    Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1-> ...

  7. [2018-12-07]用ABP入门DDD

    前言 ABP框架一直以来都是用DDD(领域驱动设计)作为宣传点之一.但是用过ABP的人都知道,ABP并不是一个严格遵循DDD的开发框架,又或者说,它并没有完整实现DDD的所有概念. 但是反过来说,认真 ...

  8. 剑指Offer:把数组排成最小的数【45】

    剑指Offer:把数组排成最小的数[45] 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如,输入数组是{3.32.321},则打印出来的这3 ...

  9. PAT 天梯赛 L2-028. 秀恩爱分得快 【数据处理】

    题目链接 https://www.patest.cn/contests/gplt/L2-028 思路 0.只处理被询问的情侣的亲密度,否则会超时 1.要注意输入数字要用字符串,还要标记性别 因为 输出 ...

  10. touchweb手机网站图片加载方法(canvas加载和延迟加载)

    一.canvas图片加载 关于canvas加载,我的方法是,将文章中所有用到图片的地方,都用canvas代替,给canvas一个data-src,里面存放img的路径,通过canvas方法渲染图片.因 ...