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接口,很有趣。
分享到:
相关推荐
ArrayList和LinkedList是两种常见的集合,前者基于数组,后者基于链表。 9. **泛型**:泛型用于创建类型安全的容器,限制了只能存储特定类型的元素,避免了强制类型转换。 10. **反射**:Java反射机制允许程序在...
这意味着这两种语言中的所有实体都是对象,并通过类和对象的概念来组织和管理程序逻辑。值得注意的是,虽然它们借鉴了 C++ 的语法风格,但并不直接继承自 C 或 C++,而是各自发展出了独立的生态系统。 #### 内存...
Stream API支持内部迭代和外部迭代两种方式,以满足不同的需求。 Java8还包括了一些工具类的增强,如Predicate的使用、Base64编解码、字符串操作等,这些都有助于简化代码并提高开发效率。 在实际应用中,Java8还...
《LittleThings:有用且有趣的 Java 代码》是一个项目,它收集了各种实用且有趣的 Java 代码片段,旨在帮助开发者提高编程技巧,理解Java语言的精髓,并在日常开发中找到解决问题的新方法。这些代码示例主要关注内存...
- **JSON或XML格式**:为了存储和读取名单,开发者可能选择使用JSON或XML格式,这两种格式都有对应的Java库支持,如Jackson或Gson(JSON),或JAXB(XML)。 6. **异常处理**: - **错误和异常**:在文件操作、...
在实现类或结构中定位接口成员的实现的过程称为接口映射。 6,object object 类类型是所有其他类型的最终基类。C# 中的每种类型都是直接或间接从 object 类类型派生的。可以把任何类型的数值给object类型. 7,string...
4. **动画系统**:Android提供了两种类型的动画,属性动画(Property Animation)和视图动画(View Animation)。项目中可能使用了属性动画来实现更复杂的效果,例如平移、缩放、旋转等。 5. **Material Design**:...
在Android平台上开发“姻缘测试仪”应用是一个有趣且实用的项目,它可以为用户提供一种娱乐方式,通过输入两个人的姓名来计算所谓的“姻缘数”。这个应用基于Android的基础架构,结合了用户界面设计、字符串处理以及...
2. **变量声明**:Kotlin的变量声明有两种,var(可变)和val(不可变)。val用于声明只读变量,一旦赋值后就不能改变。var则可以多次赋值。 3. **函数与lambda表达式**:Kotlin的函数定义简洁明了,可以使用fun...
【描述】这个项目的核心在于实现一个随机匹配用户的功能,让两个未曾相识的用户可以在聊天室里进行互动。PHP作为服务器端的主要开发语言,会处理用户请求,连接数据库,管理用户会话,并通过Websocket或Ajax技术实现...
- 事件冒泡和事件捕获是事件处理的两种模式。 9. **异步编程** - 回调函数、Promise和async/await是JavaScript处理异步操作的主要方式。 - 异步编程有助于避免阻塞主线程,提高应用性能。 10. **ES6及新特性** ...
有声明函数和匿名函数两种形式。 3. **DOM操作**: Document Object Model (DOM) 是HTML和XML文档的结构化表示,JavaScript可以通过DOM API来操作网页元素,如添加、删除、修改元素,以及处理事件。 4. **事件...
在Android Studio中,Kotlin与Java的集成非常紧密,开发者可以方便地在两种语言之间切换,利用Kotlin的扩展函数、高阶函数等特性,使代码更加简洁。例如,Kotlin的lambda表达式和匿名函数使得处理集合和事件监听更为...
- **变量声明**:Kotlin有var(可变)和val(不可变)两种变量类型。例如,`var count = 0` 和 `val name = "Antonio"`。 - **数据类**:用于存储数据的简单类,可以自动生成equals()、hashCode()和toString()方法...
在JavaScript编程中,实现类似QQ头像弹出效果是一种常见的交互设计,它可以增强用户体验,使得网页更加生动有趣。本文将详细解析如何使用JavaScript实现这一功能。 首先,我们需要一个HTML结构来展示头像和弹出框。...
函数表达式有两种主要的形式:函数声明和函数表达式。 1. **函数声明**: 函数声明采用`function functionName(args) {...}`的形式。在这种声明方式中,函数名`functionName`在函数体之前定义。一个有趣的特性是...
在编程领域,"编码高尔夫"(Coding Golf)是一种有趣的挑战,目标是用最少的代码行数来解决问题。在这个场景中,我们关注的是Python语言的编码高尔夫解决方案,这通常涉及到使用Python的强大特性和语法技巧来优化...
CNN是一种专门用于处理图像数据的神经网络结构,通过多层特征提取,能够从原始像素数据中学习到高级抽象特征,从而实现对图像内容的准确理解和识别。 ### 3. TensorFlow与Android集成 在Android平台上实现这样的...
JavaScript是Web开发中不可或缺的一部分,它提供了两种声明函数的方式:函数声明式和函数表达式。这两者虽然看似相似,但存在显著的区别。 1. **函数声明式**:这是JavaScript中最直接的函数定义方式,通常以`...