2010-04-25 5 views
2

В чем разница в правиле оценки оператора и метода в Java?В чем разница между Оператором и Методом?

+8

Ваш вопрос не имеет смысла ни на C, ни на Java. –

+0

Существует довольно много языков, которые позволяют перегрузке оператора (с помощью метода или функции или, тем не менее, вы называете это). Среди них ни C, ни Java. Например, C++ и Python. – extraneon

+0

@Greg: Я просто хочу знать, как операторы и методы оцениваются на Java. – unj2

ответ

1

Ответ Femaref довольно хорош; Я хотел бы расширить его.

Операторов (обычно) зашитые на язык: такие вещи, как +, -, * и /, как правило, непосредственно переводятся компилятором в машинном языке (если это основной механизм для этой языковой системы) без необходимости явно вызвать метод в библиотеке. Так оно и есть/было в C, например. Если эти операторы не были определены на этом языке, вам нужно будет ввести код plus(2,2) вместо 2 + 2.

Операторы, определенные на языке, имеют преимущество при использовании встроенного приоритета. * и / обычно имеют более высокий приоритет, чем + и -, поэтому вы можете написать 3 * 3 + 4 * 4 и получить 25, а не 52 или 84, которые вы получили бы без таких приоритетов или разных приоритетов.

Линия становится немного серым, когда операторы распознаются компилятором, но все же делегируются в библиотеку. Сложные числа в FORTRAN могут быть примером: часто компилятор не хочет напрямую компилировать сложные операции в машинный код, но будет генерировать машинный код для вызова библиотеки.

Большинство людей думает только об арифметических операторах, таких как +, - и т. Д. Но вы также можете рассмотреть квадратные скобки ([ ]) оператора для индексирования массива, например.

Некоторые языки позволяют перегрузить их операторы, поэтому вы можете заменить вызов метода на то, что обычно выполняет оператор.

Большинство языков не позволяют вам определять собственные операторы, которые поддерживают те же механизмы, что и встроенные. Исключение составляет Scala; вы можете определить оператора +++, если хотите, и подключить его к способу, который вы предоставляете. Некоторые люди думают, что перегрузка оператора затрудняет понимание кода, поэтому жюри все еще не знает, является ли это хорошей идеей.

3

Операторы могут рассматриваться как синтаксический сахар для

static Foo Plus (Foo right, Foo left) 
{ 
    // do stuff 
    return output; 
} 

Это просто более удобно писать right + left вместо Class.Plus(right, left).

+1

Но не на C или Java. – SLaks

0

В C и Java вы не можете переопределить оператор «+» для своих классов, поэтому ваш вопрос имеет смысл для других языков.

Есть языки, где операторы могут быть переопределены, такие как C++ и Python. Если вас интересует такое сравнение, почему бы не попробовать? Даже из ваших тестов показывает, что оператор «+» медленнее/быстрее, чем метод .add(), это может измениться, если вы измените компилятор или среду.

Я думаю, вы должны использовать что-то, что хорошо для вас.

Был советы в Java, чтобы использовать StringBuffer вместо + оператора с String но новейшие реализации Java сделать лучше оптимализация для + оператора, поэтому этот совет не то, что хорошо для нового кода.

0

Я поразмыслил над тем, что вы просите. Вы можете спросить, например, то, что Java гарантирует о том порядке, в котором bar() и baz() выполняются в следующих двух случаях:

foo.bar() + foo.baz() 
fee(foo.bar(), foo.baz()) 

В обоих случаях bar() определенно вызывается перед baz() (JLS 15.7.1, 4)

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

  • Нет связанных вопросов^_^