2014-10-28 80 views
0

通常情况下,使用new ObjClass(args)来创建新的对象,如何理解这个?用新运营商无法理解java语句

import org.jzy3d.plot3d.builder.Mapper; 
    ...... 
    Mapper mapper = new Mapper() { 
     public double f(double x, double y) { 
      return 10 * Math.sin(x/10) * Math.cos(y/20) * x; 
     } 
    }; 
+1

http://docs.oracle.com /javase/tutorial/java/javaOO/anonymousclasses.html – khelwood 2014-10-28 16:30:56

回答

5

如果Mapper是一个类,那么它会创建一个匿名类来扩展它。如果Mapperfinal类,那么此代码将不会编译。

如果Mapper是接口,那么它会创建一个实现它的匿名类。

更多信息:

0

该构建限定延伸的Mapper类并覆盖其f方法匿名类。

通常,您将使用@Override(从Java 6开始)对overriden方法进行注释。

0

此代码创建从映射器导出的anonymous类的一个实例,并创建/覆盖方法F

1

您正在创建新anonymous映射器,它包含的一种方法。这与定义包含该方法的MyCustomMapper extends/implements Mapper的结果相同。

这个想法是,当你需要一个自定义功能时,你可以使用anonymous类,这个自定义功能对于一个用例来说相对简单。例如,你不应该在任何其他类中使用这个映射器。

1

这种类型的结构被称为anonymous class

例子:

interface Mapper { 
    public double f(double x, double y); 
} 

Mapper m = new Mapper() { 
    @Override // this annotation is not mandatory, but good practice! 
    public double f(double x, double y) { 
     return 10 * Math.sin(x/10) * Math.cos(y/20) * x; 
    } 
} 

这将是一样的:如果你想要做一些快速

public class MyMapper implements Mapper { 
    @Override 
    public double f(double x, double y) { 
     return 10 * Math.sin(x/10) * Math.cos(y/20) * x; 
    } 
} 

// and then constructing like this: 
Mapper mapper = new MyMapper(); 

这个概念/结构是很方便的。

与Java 8这类事情已经变得更加简单与Lambda Expressions

Mapper mapper =() -> return 10 * Math.sin(x/10) * Math.cos(y/20) * x; 

一本好书,关于lambda表达式在Java中8:Lambda Reference by Angelika Langer & Klaus Kreft