匿名类直接new接口

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

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

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

package jimmy;
import contract.ISay;
public class Program {
    public static void main(String[] args) {
        ISay say = new ISay() {
            public void sayHello() {
                System.out.println("Hello java!");
            }
        };
    }
}

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

还好这只是假象,观察bin目录下的class输出,会发现有一个类似Program

1.class的文件,如果反编译观察一下,发现原来是编译器自动生成一个类Program1:

package jimmy;

import contract.ISay;
import java.io.PrintStream;

class Program$1
  implements ISay
{
  public void sayHello()
  {
    System.out.println("Hello java!");
  }
}

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

参考:

http://www.cnblogs.com/yjmyzz/p/3448330.html

http://blog.sina.com.cn/s/blog_62ea4cf40100mubj.html

时间: 2024-10-07 13:22:46

匿名类直接new接口的相关文章

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

java中的匿名类有一个倍儿神奇的用法,见下面代码示例: package contract; public interface ISay { void sayHello(); } 上面是一个简单的接口,下面是如何使用: package jimmy; import contract.ISay; public class Program { public static void main(String[] args) { ISay say = new ISay() { public void say

学习笔记:因为java匿名类学习到接口的一些小用法

在看CometD的示例代码时发现了许多有意思的代码,但说实话看别人的代码确实是件很累的事情,所以就看到这个知识点做一下记录吧. 先看一段代码: 代码1 这段代码中有一个new的操作,而且是在方法参数中进行的,这给了我一个好奇的点.此时首先想到的是C#中的匿名类,于是网上找了找资料,确实是类似的语法特性.继续看代码就发现一个问题: ConfigurableServerChannel是一个接口,而且Initializer是ConfigurableServerChannel中的一个内部嵌套接口. 代码

java使用匿名类直接new接口

翻看Vector代码的时候,看到这么一段. /** * Returns an enumeration of the components of this vector. The * returned {@code Enumeration} object will generate all items in * this vector. The first item generated is the item at index {@code 0}, * then the item at index

浅谈Java的匿名类

在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码的输出是什么? Runnable x = new Runnable() { @Override public void run() { System.out.println(this.getClass()); } }; x.run(); 实际答案是出现xxxx$1这样一个类名,它是编译器给定的名称.

匿名对象和匿名类

一.匿名对象 匿名对象是没有名字的实体,也就是该实体没有对应的变量名引用  匿名对象的特征:            创建的匿名类的对象只能够调用一次            匿名对象只在堆内存中开辟空间,而不存在栈内存的引用            每次创建匿名对象都是不同的对象  package com.yyx.pratice; public class AnonymousObject { public static void main(String[] args) { printStuInfo(

实现接口的匿名类的对象

public class TestUSB { public static void main(String[] args) { Computer c = new Computer(); c.works(new USB() {//接口是没有构造器的,这里不能看作构造器,而是实现接口的匿名类 @Override public void work() { System.out.println("====anonymous usb working===="); } }); } } class

抽象类 抽象方法 接口 类部类 匿名类部类 设计模式之单例模式(懒汉模式及饿汉模式)

---恢复内容开始--- 抽象类  关键字  abstract 不能被实例化(创建对象),可通过类名调用静态方法 子类继承抽象类必须重写父类的所有抽象方法,然后用多态调用 接口:关键字 interface   类名 implements 接口名 1.接口中只能有抽象方法,并且不能被实例化,通过多态调用 2.接口与接口之间的关系: 继承关系(可以多继承); 类部类: 在类中定义的类 创建类部类对象    外部类名.内部类名  对象名 = new 外部类名().new内部类名() 匿名类部类: 在写

匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口

匿名内部类(必须掌握): 匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口. IA被定义为接口. IA I=new IA(){}; 注:一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名. 因其为局部内部类,那么局部内部类的所有限制都对其生效. 匿名内部类是唯一一种无构造方法类. 匿名内部类在编译的时候由系统自动起名Out$1.class. 如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类. 因匿名内部类无构造方法

Lamb表达式匿名类实现接口方法

Lamb表达式匿名类实现接口方法 import java.util.ArrayList; public class HandlerDemo{ public static void main(String[] args) { ArrayList<Object> list = new ArrayList<>(); // 测试匿名类实现doBusy方法 new HandlerDemo().testHandler(() -> { list.add("测试匿名类实现doBus