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

java中的匿名类有一个倍儿神奇的用法,见下面代码示例:

1 package contract;
2
3 public interface ISay {
4     void sayHello();
5 }

上面是一个简单的接口,下面是如何使用:

 1 package jimmy;
 2 import contract.ISay;
 3 public class Program {
 4     public static void main(String[] args) {
 5         ISay say = new ISay() {
 6             public void sayHello() {
 7                 System.out.println("Hello java!");
 8             }
 9         };
10     }
11 }

初看上去,就好象在“不提供接口实现的情况下,直接new了一个接口实例”,对于C#er来说,有一种尽毁三观的赶脚。

还好这只是假象,观察bin目录下的class输出,会发现有一个类似Program$1.class的文件,如果反编译观察一下,发现原来是编译器自动生成一个类Program$1:

 1 package jimmy;
 2
 3 import contract.ISay;
 4 import java.io.PrintStream;
 5
 6 class Program$1
 7   implements ISay
 8 {
 9   public void sayHello()
10   {
11     System.out.println("Hello java!");
12   }
13 }

如果有些场合,只需要临时需要创建一个接口的实现类,上面的"技巧"可以用来简化代码.

 

 

时间: 2024-11-03 16:29:49

java:使用匿名类直接new接口的相关文章

java中匿名类有关键字new 实例化一个对象有关键字new

问题描述 java中匿名类有关键字new 实例化一个对象有关键字new java中匿名类有关键字new 实例化一个对象有关键字new 那么如何区分匿名类和实例化一个对象 解决方案 不用区分.其实两者是一回事. 你可以认为对匿名类new是一个特例,它产生一个这个类型,然后产生一个这个类型的对象. 本质上这里new还是实例化对象. 解决方案二: 在程序运行中,以及调用者看来,一个匿名类的对象和一个一般的对象是一回事. 解决方案三: 转化的中间代码两个是一回事儿 解决方案四: C++中关键字newne

java监听-java中匿名类作为一个方法的参数的时候是不是默认返回一个匿名对象

问题描述 java中匿名类作为一个方法的参数的时候是不是默认返回一个匿名对象 java中匿名类作为一个方法的参数的时候是不是默认返回一个匿名对象 比如用在监听方法当中作为参数的时候 解决方案 可以这么理解,通常是创建一个匿名类的实例然后作为参数传递给指定方法 . 解决方案二: 匿名类,作为参数是返回相应的匿名对象. 具体还是要看调用的函数有参数要求吧,参数是一个对应的匿名类,或者其父类,使用它就没有问题.

对比.net使用Java的匿名类对工厂方法模式提供更优雅的实现

工厂模式的意图: 定义一个用户创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 结构图: 场景: 这里制造两个手机product:Nokia.Motorola,为了制造这两个Product需要使用两个Creator(Factory)来制造它们.这两个Creator都有各自的Concreator(类似生产线).这两个手机都实现必须实现两个最基本的功能:call(打电话).photo(拍照). product: /// <summary> ///

java中匿名类的注意细节

abstract class Outer{     int num;     public Outer(int x){         num = x;     }     public abstract void show1();           public abstract void show2(); }   public class PC{     public static void main(String[] args){        new Outer(55)//构造父类部分

匿名对象-java中接口,匿名类,实现这个接口类的方法

问题描述 java中接口,匿名类,实现这个接口类的方法 不能直接new一个接口,但是接口再被实现后,再new这个接口,并写上实现这个接口的方法,那么new的这个接口如果没有赋值引用,那么new的这个接口就是一个匿名类,这么理解对不 解决方案 没有名字的类就是匿名类,没有名字的对象就是匿名对象. 判断标准,你能不能说出类的名字.说不出肯定是匿名类. 解决方案二: 你看下这个文章 应该能理解了匿名类直接new接口 解决方案三: 利用匿名内部类实现Java接口方法java实现接口类Java面向对象 匿

使用 Lambda 取代 Android 中的匿名类_Android

Lambda是第十一个希腊字母,大写Λ,小写λ,额,跑题了-Lambda表达式 是Java8的新特性之一: Lambda表达式 函数式接口 流API 默认方法 新的Date Time API Lambda表达式 取代了匿名类 ,取消了模板,允许用函数式风格编写代码. 由于最近接触了RxJava,遇到了Lambda,立马就喜欢上了~所以就学习了一下. 本文主要介绍一下Lambda在Android中替代匿名类的部分使用场景. 在Android中使用Lambda gradle-retrolambda

Java通过接口实现匿名类的实例代码_java

复制代码 代码如下: package com.chase.test; /** * 通过接口实现匿名类的实例 *  * @author Chase *  * @date 2013-10-18 下午04:28:17  * * @version V1.0 */interface I1 {    void print();    void eat();} public class AnonymousClass {     public static String excute(I1 c){       

使用技巧:内部类和匿名类优化Java代码

技巧|优化 Java 1.1通过对Java语言规范进行修改,显著简化了一些实用结构的实现.在那些修改中,最引人注目的就是内部类和匿名类.如运用得当,它们可使程序更易理解和维护.下面来看看这些特性具体是如何工作的,如何正确使用它们,以及如何避免一些常见的错误. 内部类 简单地说,"内部类"是在另一个类的内部声明的类.从Java 1.1开始,你可在一个类中声明另一个类,这与声明字段和方法非常相似.包装了内部类声明的类就称为"外部类". 实际上,Java语言规范还允许你做

使用内部和匿名类优化Java代码

优化 Java 1.1通过对Java语言规范进行修改,显著简化了一些实用结构的实现.在那些修改中,最引人注目的就是内部类和匿名类.如运用得当,它们可使程序更易理解和维护.下面来看看这些特性具体是如何工作的,如何正确使用它们,以及如何避免一些常见的错误.    内部类    简单地说,"内部类"是在另一个类的内部声明的类.从Java 1.1开始,你可在一个类中声明另一个类,这与声明字段和方法非常相似.包装了内部类声明的类就称为"外部类".    实际上,Java语言规