2014-10-28 3 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

ответ

5

Если Mapper является классом, то он создает анонимный класс, который его расширяет. Если Mapper является классом final, тогда этот код не будет компилироваться.

Если Mapper является интерфейсом, то он создает анонимный класс, который его реализует.

Подробнее:

0

Эта конструкция определяет анонимный класс, расширяющий Mapper класс и переопределить его метод f.

Как правило, вы должны аннотировать метод override с помощью @Override (начиная с Java 6).

0

Этот код создает экземпляр anonymous класса, производного от Mapper и создает/переопределяет метод ф

1

Вы создаете новый anonymous Mapper, который содержит этот один метод. Это имеет тот же результат, что и определение 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; 

Хорошая книга о лямбда-выражений в Java 8: Lambda Reference by Angelika Langer & Klaus Kreft

Смежные вопросы