Что такое оператор в java
Перейти к содержимому

Что такое оператор в java

  • автор:

Руководство по Java Core. Базовые операторы.

Для манипулирования переменными в языке Java предусмотренно множество операторов. Все операторы мы модем поделить на такие группы:

Рассмотрим эти группы отдельно.

Арифметические операторы

Этот тип операторов используется для математических операций.

Представим, что у нас есть две целочисленные переменные (int) A = 50, B = 20.

+ (Сложение) A + B = 70
– (Вычитание) A – B = 30
* (Умножение) A * B = 1000
/ (Деление) A / B = 2
% (Остаток от деления) A % B = 10
++ (Инкремент) A++ = 51
— (Декремент) B– = 19

Операторы сравнения

Результатом оператора сравнения является логический тип boolean, который говорит нам, является ли данное утверждение правдой (true) или ложью (false).

Представим, что у нас есть две целочисленные переменные (int) A = 50, B = 20.

== (Равен) (A == B) -> false
!= (Не равен) (A != B) -> true
> (Больше, чем) (A > B) -> true
< (Меньше, чем) (A < B) ->false
>= (Больше, чем или равно) (A >= B) -> true
(A false

Битовые операторы

В языке Java существует ряд битовых операторов, которые поддерживают целочисленные типы данных.

Битовые операторы позволяют нам выполнять побитовые операции.

Представим, что у нас есть две целочисленные переменные (int) A = 50, B = 20.

& (Побитовое ‘И’) (A & B) -> 0010000
| (Побитовое ‘ИЛИ’) (A | B) -> 0011 0110
^ (Побитовое ‘Исключающее И’)
(A ^ B) -> 0010 0110
~ (Побитовое дополнение) ( ~A ) -> 1100 1101
(A 100 (0110 0100)
>> (Побитовый сдвиг вправо) (B >> 2) -> 5 (0000 0101)
>>> (Побитовый сдвиг вправо с присвоением)
( A >>> 3) -> 6 (0000 0110)

Логические операторы

В языке Java поддерживаются 3 логических оператора, все они приведены таблице ниже.

Представим, что у нас есть две логические переменные (boolean) T = true и F = false.

&& (Логическое ‘И’) (A && B) -> false
|| (Логическое ‘ИЛИ’) (A || B) -> true
! (Логическое ‘НЕ’)
!(A || B) -> false

Операторы присваивания

В языке Java есть 11 операторов присваивания. Рассмотрим их на примерах.

Представим, что у нас есть две целочисленные переменные (int) A = 50, B = 20 и некая переменная С, значение которой, пока не присвоено.

=
С = A + B ( C == 70 )
+= A += B (A == 70)
-=
A -= B (A == 30)
*= B *= A (B == 1000)
/= A /= B (A == 2)
%=
A %= B (A == 10)
B
>>=
A >>= 2 (A == 12)
&= B &= 2 (B = B & 2 )
^=
A ^= 2 (A == 48)
|= A |= 3 (A == 51)

Другие

К другим операторам в языке Java относится только 1. Это тернарный оператор ветвления IF.

Более подробно мы рассмотрим IF далее, а пока приведём общую форму записи:

Допустим у нас есть логическая переменная (boolean) isActive, значение которой нам неизвестно.

int a = (isActive) ? 100 : 200.

Если isActive = true, тогда a = 100.

Если isActive = false, тогда a = 200.

В этом уроке мы рассмотрели операторы для манипулирования переменными в языке Java.

Более подробно с операторами в языке Java можно ознакомиться в спецификации языка Java (Java Language Specification).

В следующем уроке мы рассмотрим массивы в языке Java и их виды.

Оператор ?: в Java: назначение и примеры использования

Оператор ?: в Java — это тернарный оператор, используемый как компактная формулировка if-else . В зависимости от результата логического условия, он выбирает одно из двух выражений: условие ? выражениеПриИстине : выражениеПриЛожности .

В качестве примера можно привести: java int highest = (x > y) ? x : y; // x побеждает, если он больше y, в противном случае предпочтение отдается y.

Здесь переменной highest присваивается большее из двух значений, x или y .

Расшифровка тернарного оператора

Элегантность синтаксиса

Тернарный оператор способствует созданию простого и понятного кода, заменяя обширные блоки if-else . Он особенно полезен там, где значение некой переменной следует определить на основе условного выражения, тем самым повышая компактность кода.

Совместимость возвращаемых типов

Оба возможных результата выражений — как при истинном, так и при ложном условиях — должны быть совместимы по типу в контексте их использования. Другими словами, они должны представлять результаты одного и того же типа или такие, которые можно привести к общему типу.

Нельзя оставаться без результата

Согласно спецификации языка Java, как истинное, так и ложное выражение обязаны иметь возвращаемое значение. Методы с результатом void здесь неприменимы, подчеркивая ориентацию на функциональный стиль программирования, где каждое действие должно возвращать результат.

Практическое применение

Умелое использование тернарного оператора позволяет составлять элегантный и эффективный код. Он отлично подходит для расчетных полей, мгновенного возврата из методов или условного рендеринга в пользовательском интерфейсе.

Визуализация

Оператор ?: в Java в прямом смысле слова можно увидеть как перекресток, на котором принимается решение:

Что значит оператор .

Произойдет следующее: интерфейс List наследуется от Iterable, у которого есть метод forEach(Consumer action) .

Consumer — функциональный интерфейс, с одним методом accept(T t) , который принимает один параметр. В данном случае, consumer — метод print класса System.out , который принимает строку.

Функциональный интерфейс — интерфейс, который имеет только 1 абстрактный метод.

Отслеживать
81.2k 9 9 золотых знаков 78 78 серебряных знаков 136 136 бронзовых знаков
ответ дан 6 сен 2017 в 10:57
DaysLikeThis DaysLikeThis
1,798 13 13 серебряных знаков 27 27 бронзовых знаков
А можно, пожалуйста, пример?
6 сен 2017 в 10:59
@DaysLikeThis, перенеси свой комментарий в ответ
6 сен 2017 в 11:24

Оператор двойное двоеточия :: — «ссылка на метод» (Method Reference). По сути — сокращенная запись для доступа(ссылки) на метод из функционального интерфейса при использовании лямбда выражения которые появились с Java 8.

Насколько я понял это можно исползовать вызывая метод через имя класса даже если он не является статическим. Скажем такой пример, думаю суть поймёте.

class MyClass < private static boolean method()< return false; >private boolean method2() < return false; >public static void main(String[] args) < System.out.println(MyClass.method()); //для статического Consumermethod2 = MyClass::method2; //для не статического System.out.println(method2); > > 

Операторы

Операторы в языке Java — это специальные символы, которые сообщают транслятору о том, что вы хотите выполнить операцию с некоторыми операндами. Некоторые операторы требуют одного операнда, их называют унарными. Одни операторы ставятся перед операндами и называются префиксными, другие — после, их называют постфиксными операторами. Большинство же операторов ставят между двумя операндами, такие операторы называются инфиксными бинарными операторами. Существует тернарный оператор, работающий с тремя операндами.

В Java имеется 44 встроенных оператора. Их можно разбить на 4 класса — арифметические, битовые, операторы сравнения и логические.

Арифметические оператор

Арифметические операторы используются для вычислений так же как в алгебре (см. таблицу со сводкой арифметических операторов ниже). Допустимые операнды должны иметь числовые типы. Например, использовать эти операторы для работы с логическими типами нельзя, а для работы с типом char можно, поскольку в Java тип char — это подмножество типа int.

Оператор Результат Оператор Результат
+ Сложение + = сложение с присваиванием
вычитание (также унарный минус) -= вычитание с присваиванием
* Умножение *= умножение с присваиванием
/ Деление /= деление с присваиванием
% деление по модулю %= деление по модулю с присваиванием
++ Инкремент декремент

Четыре арифметических действия

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

class BasicMath < public static void int a = 1 + 1; int b = a * 3; main(String args[]) < int c = b / 4; int d = b - а; int e = -d; System.out.println("a = " + а); System.out.println("b = " + b); System.out.println("c = " + c); System.out.println("d = " + d); System.out.println("e x mod 10 = " + x % 10); System.out.println("y mod 10 a = " + a); System.out.println("b = " + b); System.out.println("c a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); System.out.println("d 1" cellspacing="0" cellpadding="2">ОператорРезультатОператорРезультат~побитовое унарное отрицание (NOT) &побитовое И (AND)&=побитовое И (AND) с присваиванием|побитовое ИЛИ (OR)|=побитовое ИЛИ (OR) с присваиванием^побитовое исключающее ИЛИ (XOR)^=побитовое исключающее ИЛИ (XOR) с присваиванием>>сдвиг вправо>> =сдвиг вправо с присваиванием>>>сдвиг вправо с заполнением нулями>>>=сдвиг вправо с заполнением нулями с присваиваниемсдвиг влевосдвиг влево с присваиванием 

Пример программы, манипулирующей с битами

В таблице, приведенной ниже, показано, как каждый из операторов битовой арифметики воздействует на возможные комбинации битов своих операндов. Приведенный после таблицы пример иллюстрирует использование этих операторов в программе на языке Java.

АВORANDXORNOT A
000001
101010
011011
111100
class Bitlogic < public static void main(String args []) < String binary[] = < "OOOO", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" >; int a = 3; // 0+2+1 или двоичное 0011 int b = 6; // 4+2+0 или двоичное 0110 int c = a | b; int d = a & b; int e = a ^ b; int f = (~a & b) | (a & ~b); int g = ~a & 0x0f; System.out.println(" a = " + binary[a]); System.out.println(" b = " + binary[b]); System.out.println(" ab = " + binary[c]); System.out.println(" a&b = " + binary[d]); System.out.println(" a^b = " + binary[e]); System.out.рrintln("~a&b|а^~Ь = " + binary[f]); System.out.println(" ~a b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]); > >

Ниже приведен результат работы этой программы:

С:\> java HexByte b = 0xf1

Беззнаковый сдвиг вправо

Часто требуется, чтобы при сдвиге вправо расширение знакового раз-ряда не происходило, а освобождающиеся левые разряды просто запол-нялись бы нулями.

class ByteUShift < static public void main(String args[]) < char hex[] = < '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'а', 'b', 'с', 'd', 'e', 'f' >; byte b = (byte) 0xf1; byte c = (byte) (b >> 4); byte d = (byte) (b >> 4); byte e = (byte) ((b & 0xff) >> 4); System.out.println(" b = 0x" + hex(b >> 4) & 0x0f] + hex[b & 0x0f]); System.out.println(" b >> 4 = 0x" + hex[(c >> 4) & 0x0f] + hex[c & 0x0f]); System.out.println("b >>> 4 = 0x" + hex[(d >> 4) & 0x0f] + hex[d & 0x0f]); System.out.println("(b & 0xff) >> 4 = 0x" + hex[(e >> 4) & 0x0f] + hex[e & 0x0f]); > >

Для этого примера переменную b можно было бы инициализировать произвольным отрицательным числом, мы использовали число с шест-надцатиричным представлением 0xf1. Переменной с присваивается ре-зультат знакового сдвига b вправо на 4 разряда. Как и ожидалось, рас-ширение знакового разряда приводит к тому, что 0xf1 превращается в 0xff. Затем в переменную d заносится результат беззнакового сдвига b вправо на 4 разряда. Можно было бы ожидать, что в результате d со-держит 0x0f, однако на деле мы снова получаем 0xff. Это - результат расширения знакового разряда, выполненного при автоматическом по-вышении типа переменной b до int перед операцией сдвига вправо. На-конец, в выражении для переменной е нам удается добиться желаемого результата - значения 0x0f. Для этого нам пришлось перед сдвигом вправо логически умножить значение переменной b на маску 0xff, очис-тив таким образом старшие разряды, заполненные при автоматическом повышении типа. Обратите внимание, что при этом уже нет необходи-мости использовать беззнаковый сдвиг вправо, поскольку мы знаем со-стояние знакового бита после операции AND.

С: \> java ByteUShift b = 0xf1 b >> 4 = 0xff b >>> 4 = 0xff b & 0xff) >> 4 = 0x0f

Битовые операторы присваивания

Так же, как и в случае арифметических операторов, у всех бинарных битовых операторов есть родственная форма, позволяющая автоматичес-ки присваивать результат операции левому операнду. В следующем примере создаются несколько целых переменных, с ко-торыми с помощью операторов, указанных выше, выполняются различ-ные операции.

class OpBitEquals < public static void main(String args[]) < int a = 1; int b = 2; int с = 3; a |= 4; b >>= 1; с 

Результаты исполнения программы таковы:

С:\> Java OpBitEquals а = 3 b = 1 с = 6

Операторы отношения

Для того, чтобы можно было сравнивать два значения, в Java имеется набор операторов, описывающих отношение и равенство. Список таких операторов приведен в таблице.

Оператор Результат
== равно
!= не равно
> больше
меньше
>= больше или равно
меньше или равно

Значения любых типов, включая целые и вещественные числа, символы, логические значения и ссылки, можно сравнивать, используя оператор проверки на равенство == и неравенство !=. Обратите внимание - в языке Java, так же, как в С и C++ проверка на равенство обозначается последовательностью (==). Один знак (=) - это оператор присваивания.

Булевы логические операторы

Булевы логические операторы, сводка которых приведена в таблице ниже, оперируют только с операндами типа boolean. Все бинарные логические операторы воспринимают в качестве операндов два значения типа boolean и возвращают результат того же типа.

Оператор Результат Оператор Результат
& логическое И (AND) &= И (AND) с присваиванием
| логическое ИЛИ (OR) = ИЛИ (OR) с присваиванием
^ логическое исключающее ИЛИ (XOR) ^= исключающее ИЛИ (XOR) с присваиванием
|| оператор OR быстрой оценки выражений (short circuit OR) == равно
&& оператор AND быстрой оценки выражений (short circuit AND) != не равно
! логическое унарное отрицание (NOT) ?: тернарный оператор if-then-else

Результаты воздействия логических операторов на различные комбинации значений операндов показаны в таблице.

А В OR AND XOR NOT A
false false false false false true
true false true false true false
false true true false true true
true true true true false false

Программа, приведенная ниже, практически полностью повторяет уже знакомый вам пример BitLogic. Только но на этот раз мы работаем с булевыми логическими значениями.

class BoolLogic < public static void main(String args[]) < boolean a = true; boolean b = false; boolean с = a | b; boolean d = a & b; boolean e = a ^ b; boolean f = (!a & b) | (a & !b); boolean g = !a; System.out.println(" a = " + a); System.out.println(" b = " + b); System.out.println(" a|b = " + c); System.out.println(" a&b = " + d); System.out.println(" a^b = " + e); System.out.println("!a&b|a&!b = " + f); System.out.println(" !a a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); System.out.println("d = " + d); System.out.println("a / b = " + e); System.out.println("c / d 1" cellspacing="0" cellpadding="2" width="60%">Высший( )[ ]. ~! */% +- >>>>> >>= ==!= & ^ | && | | ?: =op= Низший 

В первой строке таблицы приведены три необычных оператора, о которых мы пока не говорили. Круглые скобки () используются для явной установки приоритета. Как вы узнали из предыдущей главы, квадратные скобки [] используются для индексирования переменной-массива. Оператор . (точка) используется для выделения элементов из ссылки на объект - об этом мы поговорим в главе 7. Все же остальные операторы уже обсуждались в этой главе.

Явные приоритеты

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

а >> b + 3

Какому из двух выражений, а >> (b + 3) или (а >> b) + 3, соответствует первая строка? Поскольку у оператора сложения более высокий приоритет, чем у оператора сдвига, правильный ответ - а>> (b + а). Так что если вам требуется выполнить операцию (а>>b)+ 3 без скобок не обойтись.

Что дальше?

Итак, мы рассмотрели все виды операторов языка Java. Теперь вы можете сконструировать любое выражение с различными типами данных. В следующей главе познакомимся с конструкциями ветвления, организацией циклов и научимся управлять выполнением программы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *