`
vearne
  • 浏览: 18856 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中两种有趣的匿名类实现

    博客分类:
  • java
阅读更多

java中的匿名类除了还有两种有趣的用法

 

/**
 * TODO Comment of AnonymousTest
 * 
 * @author aotian.zhuw
 */
class EntryInterface {

    public void print() {
        System.out.println("hello world");

    }

}

public class AnonymousTest {

    private EntryInterface a;

    public void setA(EntryInterface a) {
        this.a = a;
    }

    public void print() {
        a.print();

    }

    public static void main(String[] args) {
        AnonymousTest test = new AnonymousTest();
        test.setA(new EntryInterface() {

            public void print() {
                System.out.println("test success.");
            }
        });
        test.print();
    }
}

 

首先看上面的代码我们在setA中传入的是一个匿名类

编译之后得到三个文件EntryInterface.class AnonymousTest.class  AnonymousTest$1.class

反编译AnonymousTest$1.class文件,得到的结果如下

 

package cn.zw;

import java.io.PrintStream;

// Referenced classes of package cn.zw:
//            EntryInterface, AnonymousTest

static class AnonymousTest$1 extends EntryInterface
{

    public void print()
    {
        System.out.println("test success.");
    }

    AnonymousTest$1()
    {
    }
}
 

 

结果我们发现,java的编译器自动创建了一个EntryInterface的子类,

名为AnonymousTest$1,且该类覆盖了父类的print()方法。

修改AnonymousTest类

 

interface EntryInterface {

    public void print();

}

public class AnonymousTest {

    private EntryInterface a;

    public void setA(EntryInterface a) {
        this.a = a;
    }

    public void print() {
        a.print();

    }

    public static void main(String[] args) {
        AnonymousTest test = new AnonymousTest();
        test.setA(new EntryInterface() {

            public void print() {
                System.out.println("test success.");
            }
        });
        test.print();
    }
}

  编译之后仍旧得到三个文件EntryInterface.class AnonymousTest.class  AnonymousTest$1.class

 反编译AnonymousTest$1.class文件,得到的结果如下

 

import java.io.PrintStream;

// Referenced classes of package cn.zw:
//            EntryInterface, AnonymousTest

static class AnonymousTest$1
    implements EntryInterface
{

    public void print()
    {
        System.out.println("test success.");
    }

    AnonymousTest$1()
    {
    }
}

 这次我们发现编译器创建的AnonymousTest$1类实现了EntryInterface接口,很有趣。

0
1
分享到:
评论

相关推荐

    java解惑(罗列了95个容易让你迷惑的java知识点)

    ArrayList和LinkedList是两种常见的集合,前者基于数组,后者基于链表。 9. **泛型**:泛型用于创建类型安全的容器,限制了只能存储特定类型的元素,避免了强制类型转换。 10. **反射**:Java反射机制允许程序在...

    C#与java比较

    这意味着这两种语言中的所有实体都是对象,并通过类和对象的概念来组织和管理程序逻辑。值得注意的是,虽然它们借鉴了 C++ 的语法风格,但并不直接继承自 C 或 C++,而是各自发展出了独立的生态系统。 #### 内存...

    Java8 教程.pdf

    Stream API支持内部迭代和外部迭代两种方式,以满足不同的需求。 Java8还包括了一些工具类的增强,如Predicate的使用、Base64编解码、字符串操作等,这些都有助于简化代码并提高开发效率。 在实际应用中,Java8还...

    LittleThings:有用且有趣的 Java 代码

    《LittleThings:有用且有趣的 Java 代码》是一个项目,它收集了各种实用且有趣的 Java 代码片段,旨在帮助开发者提高编程技巧,理解Java语言的精髓,并在日常开发中找到解决问题的新方法。这些代码示例主要关注内存...

    花样点名器,随机抽选

    - **JSON或XML格式**:为了存储和读取名单,开发者可能选择使用JSON或XML格式,这两种格式都有对应的Java库支持,如Jackson或Gson(JSON),或JAXB(XML)。 6. **异常处理**: - **错误和异常**:在文件操作、...

    c#学习笔记.txt

    在实现类或结构中定位接口成员的实现的过程称为接口映射。 6,object object 类类型是所有其他类型的最终基类。C# 中的每种类型都是直接或间接从 object 类类型派生的。可以把任何类型的数值给object类型. 7,string...

    EventsCalendar_kotlinandroid_kotlin_

    4. **动画系统**:Android提供了两种类型的动画,属性动画(Property Animation)和视图动画(View Animation)。项目中可能使用了属性动画来实现更复杂的效果,例如平移、缩放、旋转等。 5. **Material Design**:...

    android实现姻缘测试仪

    在Android平台上开发“姻缘测试仪”应用是一个有趣且实用的项目,它可以为用户提供一种娱乐方式,通过输入两个人的姓名来计算所谓的“姻缘数”。这个应用基于Android的基础架构,结合了用户界面设计、字符串处理以及...

    Android开发的Kotlin入门

    2. **变量声明**:Kotlin的变量声明有两种,var(可变)和val(不可变)。val用于声明只读变量,一旦赋值后就不能改变。var则可以多次赋值。 3. **函数与lambda表达式**:Kotlin的函数定义简洁明了,可以使用fun...

    基于PHP的陌生人随机聊天室 php版.zip

    【描述】这个项目的核心在于实现一个随机匹配用户的功能,让两个未曾相识的用户可以在聊天室里进行互动。PHP作为服务器端的主要开发语言,会处理用户请求,连接数据库,管理用户会话,并通过Websocket或Ajax技术实现...

    Javascript教程.rar

    - 事件冒泡和事件捕获是事件处理的两种模式。 9. **异步编程** - 回调函数、Promise和async/await是JavaScript处理异步操作的主要方式。 - 异步编程有助于避免阻塞主线程,提高应用性能。 10. **ES6及新特性** ...

    javascript基础:供新人初学者学习

    有声明函数和匿名函数两种形式。 3. **DOM操作**: Document Object Model (DOM) 是HTML和XML文档的结构化表示,JavaScript可以通过DOM API来操作网页元素,如添加、删除、修改元素,以及处理事件。 4. **事件...

    Android研究

    在Android Studio中,Kotlin与Java的集成非常紧密,开发者可以方便地在两种语言之间切换,利用Kotlin的扩展函数、高阶函数等特性,使代码更加简洁。例如,Kotlin的lambda表达式和匿名函数使得处理集合和事件监听更为...

    KotlinBookExample:跟着安东尼奥·莱瓦(Antonio Leiva)的Kotlin(Kotlin)书一起关注的个人回购

    - **变量声明**:Kotlin有var(可变)和val(不可变)两种变量类型。例如,`var count = 0` 和 `val name = "Antonio"`。 - **数据类**:用于存储数据的简单类,可以自动生成equals()、hashCode()和toString()方法...

    javascript简单实现类似QQ头像弹出效果的方法

    在JavaScript编程中,实现类似QQ头像弹出效果是一种常见的交互设计,它可以增强用户体验,使得网页更加生动有趣。本文将详细解析如何使用JavaScript实现这一功能。 首先,我们需要一个HTML结构来展示头像和弹出框。...

    javascript高级编程之函数表达式 递归和闭包函数

    函数表达式有两种主要的形式:函数声明和函数表达式。 1. **函数声明**: 函数声明采用`function functionName(args) {...}`的形式。在这种声明方式中,函数名`functionName`在函数体之前定义。一个有趣的特性是...

    CodingBat-Python-Golf:编码高尔夫解决方案到 CodingBat Python

    在编程领域,"编码高尔夫"(Coding Golf)是一种有趣的挑战,目标是用最少的代码行数来解决问题。在这个场景中,我们关注的是Python语言的编码高尔夫解决方案,这通常涉及到使用Python的强大特性和语法技巧来优化...

    ImageLabeling:Android应用程序,为使用移动相机拍摄的照片上可以找到的东西添加标签

    CNN是一种专门用于处理图像数据的神经网络结构,通过多层特征提取,能够从原始像素数据中学习到高级抽象特征,从而实现对图像内容的准确理解和识别。 ### 3. TensorFlow与Android集成 在Android平台上实现这样的...

    浅析javascript中函数声明和函数表达式的区别

    JavaScript是Web开发中不可或缺的一部分,它提供了两种声明函数的方式:函数声明式和函数表达式。这两者虽然看似相似,但存在显著的区别。 1. **函数声明式**:这是JavaScript中最直接的函数定义方式,通常以`...

Global site tag (gtag.js) - Google Analytics