Синтаксис Java

Image
Герцог, талисман Явы

Синтаксис на Java язык программирования определяется в спецификации языка Java , так как это семантика Явы.

В этой статье дается обзор синтаксиса Java и освещаются некоторые его особенности. Подробности приведены в Спецификации языка Java Sun Microsystems .

терминология

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

Выражение
(Англ. Expression ) Под выражением понимается любая сложная языковая конструкция, результатом вычисления которой является одно четко определенное значение. В простейшем случае выражение - это константа, например Например, ключевое слово true или число (например, 1 или 0x7fff ). Более сложные выражения - это сравнения или вычисления с несколькими переменными и константами. В описаниях грамматики часто проводится различие между различными типами выражений (например, числовыми, буквальными и т. Д.), Чего здесь не должно быть.
Инструкция
(Английский. Заявление , инструкция или команда ; также называется командой ). В Java, как и во многих других императивных языках программирования, инструкция относится к единственному правилу, которое должно выполняться в ходе выполнения программы. Это включает объявление переменных, выражений, заканчивающихся точкой с запятой, управляющих структур, блоков инструкций, инструкций перехода, блоков синхронизации, возврата значений и запуска исключений.
Блок выписок
(Англ. Statement Block ) Блок инструкций используется для группировки нескольких инструкций. В результате несколько операторов могут быть интерпретированы как один оператор, что является требованием некоторых языковых конструкций, таких как управляющие структуры.

Лексическая структура

Программы на Java написаны в Unicode . В отличие от других языков, идентификаторы классов, методов, переменных и т. Д. Могут содержать не только буквы латинского алфавита и цифры, но и символы других алфавитов, например Б. Немецкие умляуты или китайские иероглифы.

Все ключевые слова в Java пишутся строчными буквами, например Б. " class" или " if".

Буквенные символы (английские литералы ) - это в Java минимально возможные выражения для чисел, отдельных символов, символьных строк ( строк ), логических значений ( trueили false) и конкретного слова null.

Разделители (английские разделители ) - это фигурные скобки и запятые, точки и точки с запятой.

Java знает логическое , сравнение и математические операторы распространены в языках программирования . Синтаксис основан на языке программирования C ++ . Например, одинарный знак равенства " =" используется как оператор присваивания, а двойной знак равенства " ==" используется для сравнений .

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

синтаксис

Типы данных

Java знает два типа данных : примитивный тип данных и ссылки на объекты. Примитивные типы данных - одна из причин, по которой Java не является строго объектно-ориентированным языком.

Примитивные типы данных

Есть восемь примитивных типов данных. Они имеют разные размеры и свойства и используются для расчета и хранения дискретных числовых значений. Все эти типы данных имеют фиксированный размер, одинаковый для всех платформ. Для каждого типа существует соответствующий класс- оболочка, поэтому их также можно рассматривать как реальные объекты.

Тип данных Размер (а) Класс-оболочка Диапазон значений описание
логический 1 бит java.lang.Boolean правда / ложь Логическое значение истинности
char 16 бит java.lang.Character U + 0000… U + FFFF Символ Юникода (= символ) (например, 'A'или '\uC3A4')
байт 8 бит java.lang.Byte −128 ... +127 Значение дополнения до двух
короткая 16 бит java.lang.Short −32 768 ... +32 767 Значение дополнения до двух
int 32 бит java.lang.Integer −2 147 483 648… + 2147 483 647 Значение дополнения до двух
долго 64 бит java.lang.Long −9.223.372.036.854.775.808…
+9.223.372.036.854.775.807
Значение дополнения до двух
плавать 32 бит java.lang.Float ± 1,4E - 45… ± 3,4E + 38 Число с плавающей запятой ( IEEE 754 )
двойной 64 бит java.lang.Double ± 4.9E - 324… ± 1.7E + 308 Число с плавающей запятой двойной точности (IEEE 754)
(а)Задает размер диапазона значений. Фактические требования к памяти зависят от платформы и реализации виртуальной машины Java.
Приведение типов

Об иерархии преобразования ( приведения типов ) примитивных типов данных можно догадаться из приведенной выше таблицы. Числовые типы данных могут быть преобразованы в следующий больший тип данных без потерь, но не наоборот. « int» Можно неявно, без специального оператора, преобразовать в « long», но не наоборот.

int i = 12345;
long l = i;

Однако для преобразования, например, « long» в « int» в обратном направлении необходимо использовать оператор преобразования типа. Информация также может быть потеряна в процессе.

long l = 12345678901L;
int i = (int) l;

Здесь происходит iпотеря информации: " " имеет значение -539222987 после назначения, потому что более значимые байты обрезаются.

Примитивный тип данных " boolean" не может быть преобразован в какой-либо другой тип данных. Символы типа " char" могут быть неявно преобразованы в любой целочисленный тип из " int". В частности, это связано с тем, что " char" - единственный беззнаковый тип данных, известный в Java. Преобразование без потерь в " short" больше невозможно со значения 32768.

полномочия

Все объекты и поля находятся в памяти кучи, и поэтому на них можно ссылаться через адрес. Доступ к объектам в Java реализован с использованием ссылок , похожих на указатели, известные из C / C ++. В определении языка (Спецификация языка Java) они называются «ссылочными значениями», чтобы было ясно, что они передаются по значению . В Java нет прямого способа отобразить адрес в памяти ссылки или изменить его, что исключает так называемую арифметику указателя в Java.

Object a = new Object();  // a referenziert das gerade neu erstellte Objekt
Object b = a;             // b referenziert dasselbe Objekt wie a
a = null;                 // a referenziert kein Objekt mehr, enthält somit die reservierte Adresse null.

Здесь следует отметить, что символьные строки (класс String) также представляют ссылочные типы, и поэтому их содержимое всегда equals()должно сравниваться с использованием метода (" ==" проверяет только ссылки, то есть адреса памяти). Это контрастирует с такими языками программирования, как C ++ и C # , которые поддерживают полную перегрузку оператора и "hallo"=="hallo"выполняют сравнение содержимого.

Зарезервированные слова

constи gotoзарезервированы, но без функции, поэтому без ключевых слов в прямом смысле. Они служат компилятору только для вывода полезных сообщений об ошибках для тех, кто переходит с C ++ или C.

true, falseи nullявляются литералами, но не являются ключевыми словами в строгом смысле слова.

С assertявляются утверждения реализованы.

private, protectedИ publicявляются модификаторы доступа ( модификаторы доступа ):

Сам класс Классы пакетов /
внутренние классы
Подклассы Другие
классы
частный да Нет Нет Нет
(без) да да Нет Нет
защищенный да да да Нет
общественный да да да да
  1. Чтобы предоставить внутренним классам доступ к частным методам и свойствам, компилятор создает статические частные методы пакета, которые имитируют вызов, установку или чтение. Эти методы имеют название access$xxx, где обозначает xxxпорядковый номер.
  2. Часто упоминается как «частный пакет», хотя этого модификатора доступа не существует.

Частные методы исключены из полиморфизма; ЧАС. определение метода с той же сигнатурой в подклассе не считается перезаписью (а скорее скрытием )

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

abstractмогут появляться перед классами и методами . Абстрактные методы не имеют реализации и должны быть переопределены в производных классах. Классы, содержащие абстрактные методы, сами должны быть объявлены абстрактными. Абстрактные классы не могут быть созданы, даже если они полностью реализованы, например B. в случае классов адаптера EventListener фреймворка Swing .

finalможет стоять перед переменными , полями, методами и классами и обеспечивает неизменность. В случае переменных и переменных-членов - их постоянство, в случае методов - невозможность их перезаписи в производных классах и, наконец, в случае классов, что из них нельзя производить дальнейшие производные. Последней переменной присваивается одноразовое значение, которое впоследствии нельзя изменить. Конечная переменная не должна быть инициализирована в объявлении, но может быть назначена только один раз в следующих альтернативных инструкциях:

public int calcFinal(int a) {
  final int b; // hier findet noch keine Zuweisung statt
  switch (a) {
    case 1:
       b = 7;
       break;
    case 2:
       b = 3;
       break;
    default:
       b = 1;
       break;
  }
  return b;
}

Доступ к конечным переменным, значение которых известно компилятору, может быть заменен компилятором на значение переменной. Компилятор может заменять вызовы методов final встроенным кодом (встраивание). Частные методы автоматически становятся окончательными.

nativeможет появляться только перед методами и означает, что реализация рассматриваемого метода была написана не на Java, а на другом языке программирования и должна быть интегрирована виртуальной машиной через библиотеку времени выполнения .

strictfpОпределяет классы и методы, операции с плавающей запятой которых должны строго соответствовать IEEE 754 .

packageобъявляет пакет, принадлежащий к сложному типу данных. Название пакета должно быть четким и в основном основываться на интернет-домене владельца или создателя.

importимпортирует символы (ранее только типы, из Java 5 также статические члены классов), чтобы их можно было использовать без полностью определенных имен. Импорт можно *расширить до полных пакетов с помощью подстановочного знака .

boolean, char, byte, short, int, long, floatИ doubleтипы. voidотсутствие типа необходимо для идентификации методов без возвращаемых значений. Для примитивных типов: см. Выше.

class, interface, enumИ @interfaceслужат для объявлять свои типы: классы, интерфейсы (интерфейсы для классов), перечисления ( тип перечисления для типобезопасного перечисления, английского типа сейфа перечисления ) и метаданных аннотаций. enumи @interfaceбыли включены в язык с Java 5.

try, catch, finally, throw, throwsОбратитесь к обработки исключений (английский язык обработки исключений ). За throwисключением брошенного. Любые исключения, вызванные методом, которые не являются производными от метода RuntimeExceptionили Errorдолжны быть throwsуказаны в объявлении метода. Это так называемые проверенные исключения . tryвключает блок, в котором могло произойти исключение. catchперехватывает tryисключение, которое произошло после блока, добавляется finallyк блоку tryили catchдля очистки, такой как закрытие файлов.

extendsи implementsслужат для наследования: наследование extendsгенетического расширения от класса к классу или от интерфейса к интерфейсу и наследование implementsреализации от интерфейса к классу. Кроме того, extendsуниверсальные типы используются для расширения типа.

superи thisсвязаны в контексте объекта с текущим объектом в его фактическом преобразовании ( this) или в преобразовании суперкласса ( super). thisиспользуется для вызова конструкторов, перегруженных в конструкторах, и для ссылки на скрытые элементы внешних структур в членах. superиспользуется в конструкторах для вызова конструктора суперкласса и в методах переопределения для вызова переопределенного метода. Кроме того, superдля разграничения типов используются универсальные типы.

newрезервирует память для новых объектов (включая массивы) в куче .

if, else, switch, case, default, while, do, for, break, continueПодавать тестовую эксплуатацию и контур управление и использование делает императивный синтаксис.

return возвращает значения из метода вызывающему методу.

volatileявляется модификатором для нелокальных переменных и запрещает компилятору JIT регистрировать оптимизацию для этой переменной, потому что несколько потоков могут использовать их одновременно (особенно в контексте собственных методов).

synchronizedОпределяет критический раздел исходного кода, который может выполняться только одним потоком за раз. Монитор блокирует раздел , как только поток входит в него. Если другой поток пытается войти в заблокированный раздел, этот поток блокируется, пока монитор не освободит раздел. В качестве монитора можно использовать любой объект Java. Если метод synchronizedотмечен значком, объект или, со статическими методами, объект класса используется в качестве монитора.

transient определяет непостоянные переменные, которые нельзя сериализовать.

instanceof - это оператор Java, который проверяет, является ли объект экземпляром указанного типа или подтипа.

Пакеты, имена, классы, интерфейсы

Java , пакет содержит несколько классов, интерфейсов и исключений и формирует свое собственное пространство имен .

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

В Java различаются простые имена, состоящие только из одного идентификатора, и полностью определенные имена, состоящие из серии идентификаторов, разделенных точками. Простые имена просто помогают программисту не набирать текст и повышают удобочитаемость программы. Компилятор всегда переводит их в полностью определенные имена.

В следующем примере показана программа Hello World на Java.

package org.wikipedia;

import static java.lang.System.out;

public class HalloWelt {

    public static void main(String[] arguments) {
        out.println("Hallo Welt.");
    }

}

В этом примере определяется класс " HalloWelt", который org.wikipediaпринадлежит пакету " ". По соглашению, имена пакетов в Java основаны на интернет-доменах их разработчиков, в данном случае org.wikipedia«для домена wikipedia.org». Направление имени меняется на противоположное, потому что в доменах Интернета имя самого внешнего модуля находится сзади, а в Java - впереди. Таким образом, пакет « org.wikipedia» находится «внутри» пакета « org».

Оператор импорта определяет простое имя для полного имени. Так определено, например, Например, инструкция " import java.io.File" дает простое имя " File" для класса, полное имя которого " java.io.File". Помимо импорта классов и интерфейсов, начиная с версии Java 5, статические поля или методы классов также можно импортировать. Такой «статический импорт» определяется дополнительным ключевым словом « static». В приведенном выше примере статическое поле " out" класса " java.lang.System" импортируется и затем используется под кратким именем " out".

Самая важная конструкция языка программирования Java, поскольку это объектно-ориентированный язык, - это класс . Декларация класса вводится с помощью ключевого слова « class». За ним следует имя класса, а затем - в фигурных скобках - определяются поля и методы класса.

Интерфейс - это особенность Java, который состоит только из объявлений методов, реализация которых определяется только классами, которые «реализуют» их. Объявление интерфейса похоже на объявление класса, но вводится с ключевым словом " interface".

package org.wikipedia;

public interface Article {

    String getName();

    void setContent(String aContent);

}

Поскольку все методы интерфейса абстрактны, ключевое слово « abstract» можно опустить для отдельных методов. Ключевое слово " public" перед отдельными методами также можно опустить, потому что методы интерфейса всегда являются общедоступными.

Начиная с Java 8, есть также возможность defaultопределять статические методы и методы в интерфейсах . Кроме того, интерфейсы могут быть помечены знаком « @FunctionalInterface», чтобы указать, что они являются функциональными интерфейсами. Это определяется объявлением только одного абстрактного метода; аннотация для этого не требуется. Функциональные интерфейсы могут быть реализованы в двух словах с использованием лямбда-выражений или ссылок на методы.

Методы

Фактическое поведение объекта определяется в методах. Подпись метода состоит из имени и типов его параметров. Кроме того, каждый метод имеет определенный тип возврата или " void", если он ничего не возвращает, и может throwsопределять ряд исключений в том, что называется " " предложением.

Пример конкретного метода:

public double summe(double a, double b) throws NotANumberException {
    if (Double.isNaN(a) || Double.isNaN(b)) {
        throw new NotANumberException();
    }
    return a + b;
}

Этот метод ожидает два числа с плавающей запятой двойной точности в качестве параметров, а также возвращает их сумму как числа с плавающей запятой. Если какое-либо число не является допустимым числом с плавающей запятой, метод вызывает исключение с именем " NotANumberException".

Пример абстрактного метода:

public abstract double summe(double a, double b) throws NotANumberException;

Атрибуты

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

Пример объявления переменной без инициализации:

private int x;

Переменные класса объявляются как статические атрибуты. Эти атрибуты существуют не один раз для каждого объекта, а только один раз для каждого класса. Ключевое слово " final" предотвращает изменение значения переменной после ее инициализации. Он используется, например, для определения констант.

Пример объявления статической и конечной переменных класса с инициализацией:

private static final int X = 2;

Поля

В языке программирования Java , поле (английский массив ) является самостоятельным объектом. Он может принимать данные типа, указанного в объявлении. Память занята только при инициализации поля. Для этого необходимо указать длину ( размер ), которая описывает, сколько элементов типа должно иметь поле. Размер массива фиксирован и не может быть изменен после его создания. В Java поле всегда индексируется положительным целым числом. Это ограничивает возможную длину массива от 0 до 2 31 - 1.

Отдельные элементы поля - аналогично атрибутам других объектов - инициализируются нулевым значением соответствующего базового типа поля при создании экземпляра поля. Для полей числовых примитивных типов это 0 или 0,0, для поля с базовым типом boolean это значение false, для полей объектных ссылок это пустая ссылка null. При создании поля объектных ссылок никакие объекты не создаются отдельно от самого поля.

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

Одномерное поле

декларация

<Datentyp>[] <Variablenbezeichner>; // Deklaration
<Datentyp> <Variablenbezeichner>[]; // Alternative Deklaration (seltener verwendet)

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

Создание

<Variablenbezeichner> = new <Datentyp>[<Anzahl>]; // Instanziierung eines eindimensionalen Feldes

При создании экземпляра одномерного поля необходимо знать как его тип данных, так и количество элементов. Как отмечалось в начале, длина поля ограничена неотрицательными целыми числами. Ключевое слово здесь newимеет то же значение, что и для всех других объектов, и создает экземпляр типа. Требуемая память резервируется как для объекта, так и для его элементов. Однако, в отличие от других объектов, поля не имеют конструкторов, и невозможно сформировать подтипы типа поля путем явного вывода.

Пример одномерного поля типа int длиной 3

int[] feld = new int[3];  // auf der linken Seite wird die Objektreferenz deklariert
                          // auf der rechten Seite wird das Feld initialisiert

Объявление и создание экземпляра не обязательно должны выполняться отдельно, но, как обычно, также могут быть записаны как одна инструкция. При доступе к элементам обратите внимание, что Java начинает отсчет с индекса 0. В этом примере доступ к первому элементу осуществляется с индексом 0, а к последнему элементу - с индексом 2.

int[] feld = {1,2,3}

сокращение от

int[] feld = new int[3];
feld[0]=1;
feld[1]=2;
feld[2]=3;

Считывание значений

int a = feld[0];         // das Auslesen erfolgt durch Angabe des Index
objekt.methode(feld[1]); // Einzelwerte eines Feldes können wie Variablen des gleichen Typs verwendet werden
int b = feld[3];         // würde in diesem Beispiel eine IndexOutOfBoundsException auslösen, da es kein 4. Element gibt

Присвоение ценностей

feld[0] = 5;             // Java ist "nullbasiert"
feld[1] = (int) 2.7;     // bei Zuweisungen muss wie bei normalen Variablen der Typ angepasst werden
feld[2] = 0;             // die Indexierung läuft immer bis n-1

Длина поля Для многих алгоритмов требуется длина поля, например, для обработки всех записей. Длина поля известна во время выполнения и может быть lengthзапрошена через объектную переменную , которая сама является типом int. Эта переменная всегда постоянна и не может быть изменена. Следовательно, невозможно присвоить другое значение.

int len = feld.length;   // Liest die Länge des Feldes aus und speichert sie in der Variablen len
feld.length = 5;         // diese Zuweisung würde einen Fehler beim Kompilieren ergeben, da sie nicht zulässig ist

Многомерные поля

Image
Пример построения двумерного двойного массива.

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

В Java многомерные поля могут быть реализованы путем указания нескольких пар квадратных скобок [], каждая пара обозначает дополнительное измерение поля. Внешнее поле, которое указывает следующее внутреннее поле, находится слева или представляет собой пару скобок, которая была определена первой. Это можно увидеть на примере изображения, которое обычно [y][x]индексируется, при этом сначала определяется строка (y), а затем столбец (x) из строки.

Пример создания двумерного поля

double[][] feld = new double[zeilen][spalten];

В этом примере следует отметить, что выделяется не только внешнее поле (здесь называется полем ), но также поля для «строк». Значит они не нулевые и тоже были созданы. Как и ожидалось от одномерного поля, ваши записи инициализируются 0 .

В матрице горизонтальные поля называются строками, вертикальные поля - столбцами. Отдельный элемент однозначно определяется индексом соответствующей строки и столбца. Синтаксис матрицы или многомерных полей в целом практически идентичен. Разница заключается в количестве закрытых квадратных скобок, которые говорят вам, сколько измерений будет у поля.

Пример создания двухмерного поля с разными размерами в «подполях»

double[][] feld = new double[3][];
feld[0] = new double[3];
feld[1] = new double[2];
feld[2] = new double[1];

В этом примере следует отметить, что в первой команде выделяется только внешнее поле (здесь называется полем ), а отдельные элементы инициализируются нулем . В следующих командах эти элементы затем назначаются «подполям», в результате получается «треугольное» поле.

Как и в случае с одномерными массивами, существует также сокращенная версия многомерных массивов:

int[][] array2D={{1,2,3},{4,5,6}};
//Entspricht "=new int[2][3];" mit den darauf folgenden Zuweisungen
//"array2D[0][0]=1;"
//"array2D[0][1]=2;"
//(...)
//"array2D[1][2]=6;"

Где помещаются квадратные скобки ([]), решать программисту:

int[][] A

такой же как

int A[][]

или также

int[] A[]

Общий синтаксис

<Datentyp> [] <Feldvariable> = new <Datentyp> [<Anzahl>] ;

В эллипсы «...» представляют собой дополнительные пары скобок, каждая из которых создает дополнительное измерение. Доступ к элементам аналогичен одномерному полю. Однако следует отметить, что к соответствующему внешнему полю также можно получить доступ, например, Б. определить количество строк. На примере двумерного поля число можно определить следующим образом.

Считывание и присвоение значений

double wert = feld[y][x];                // liefert den Wert des Feldes x,y
feld[y][x] = wert;                       // weist dem Feld x,y einen Wert zu

Определение длины поля и подполей

int zeilenanzahl = feld.length;          // weist der Variable "zeilenanzahl" den Wert von "feld.length" zu

Длину подполей можно определить с помощью индекса поля.

int spaltenanzahl = feld[index].length;  // weist der Variable "spaltenanzahl" den Wert von "feld[index].length" zu

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

double[] zeilenfeld = feld[index];       // ermittelt das erste "Unterfeld" mit gegebenen Index
int spaltenanzahl = zeilenfeld.length;   // weist der Variable "spaltenanzahl" den Wert von "zeilenfeld.length" zu


Инструкции и управляющие структуры

Image
Структограмма линейной программы

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

В качестве управляющих структур доступны оператор Conditional и оператор ветвления и case , а также цикл While - Do-while - и For и его различные формы.

Условный оператор и ветвление

Image
Структограмма оператора if
Image
Структограмма оператора if-else

Условный оператор и ветви , о которых говорится в следующем , как , если заявление , дает инструкции для выполнения предмета к определенному условию. Для этого используется ключевое слово «если». Далее следует пара круглых скобок, в которых можно определить условие. Условие - это выражение, которое должно возвращать логическое значение ( истина или ложь ) в качестве результата . Это отличает Java от других языков, таких как C, где в качестве условий допускаются и другие значения. Также следует отметить, что часто встречающееся ключевое слово «then» не существует.

Ключевое слово else может использоваться для выполнения оператора в случае, если условие не выполняется. Это необязательно, и в этом случае это называется ветвью, потому что выполняется либо первая, либо вторая инструкция. В качестве альтернативы вместо else можно использовать else if, которое, как и первое if, ожидает другого условия. Это дает возможность строить каскады веток. Однако без структурирования с использованием блоков (фигурных скобок) существует риск зависания else , в котором неясно, какому оператору If должна быть назначена ветвь Else.

Общий синтаксис

if (<Bedingung>)
    <Anweisung>;
else
    <Anweisung>;

Пример простого оператора If с блоком из двух выходов

if (i < 0) {
    System.out.print("Die Zahl ist negativ"); // Bedingte Ausgabe
    System.out.println();                     // Zeilenumbruch auf der Konsole
}

Более сложный пример

if (i < 0) {
    System.out.println("Die Zahl ist negativ");
}
else if (i == 0) {
    System.out.println("Die Zahl ist Null");
}
else if (i < 5) {
    System.out.println("Die Zahl ist kleiner als 5");
}
else {
    System.out.print("Die Zahl ist größer oder gleich 5");
}

Тернарный оператор

Существует дополнительная аббревиатура для простого оператора If. Это может использоваться в выражении, но ограничено «или-или». Т.е. в любом случае он должен возвращать определенное значение. Сам оператор - это вопросительный знак '?' которому должно предшествовать логическое выражение. Возвращаемое значение для случая, когда логическое выражение истинно, следует за вопросительным знаком. За ним следует двоеточие ":", после которого должно следовать возвращаемое значение, если логическое выражение не истинно (ложно).

синтаксис

<Bedingung> ? <Ausdruck> : <Ausdruck>

пример

int a = (i<0) ? -i : i; // kehrt vor der Zuweisung an a das Vorzeichen von i um, wenn i negativ ist (Betrag von i)

Заявление о переключении

Image
Структограмма инструкции переключения
  • Различие между случаями, когда выражение может быть символом, целым числом, символьной строкой или типом перечисления.
switch (''Ausdruck'') {
   case ''Konstante1'': ''Anweisung1''; break;
   case ''Konstante2'': ''Anweisung2''; break;
   default: ''Anweisung3'';
}

измельчать

Java различает четыре различных типа циклов .

  • Повторяйте оператор до тех пор, пока условие истинно, при этом условие проверяется перед оператором ( цикл while ).
while (''Bedingung'') ''Anweisung'';
  • Повторение инструкции до тех пор, пока условие истинно, при этом условие проверяется только после выполнения ( цикл do-while ).
do ''Anweisung''; while (''Bedingung'');
  • Инициализирует значение, повторяет оператор, пока условие истинно, и выполняет второй оператор после каждого прохода цикла ( для цикла ).
for (''Initialisierung''; ''Bedingung''; ''Anweisung2'') ''Anweisung1'';
  • Кроме того, существует расширенный цикл for, также известный как цикл foreach, который позволяет выполнять операторы для каждого элемента итерируемого объекта ( последовательности , списки и т. Д.).
for (''Element'' : ''Kollektion'') ''Anweisung'';

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

char[] chars = new char[] { 'a', 'b', 'c' }; // neues Zeichen-Array anlegen
for (char c : chars) {
    System.out.println("Zeichen: " + c); // Jedes Zeichen auf die Konsole schreiben.
}

List<Character> charlist = new ArrayList<Character>(); // neue Zeichen-Liste anlegen
charlist.add('a'); // Werte hinzufügen (mit Autoboxing)
charlist.add('b');
charlist.add('c');
for (Character c : charlist) {
    System.out.println("Zeichen: " + c); // Jedes Zeichen auf die Konsole schreiben.
}

Выражения

В отличие от других языков программирования, таких как C , порядок, в котором выражения вычисляются в Java, уже определен в определении языка: двоичные инфиксные операторы одного и того же ранга , которые не являются операторами присваивания, всегда оцениваются слева направо. Кроме того, как и в C, вычисление логических выражений может быть сокращено, если результат уже был определен. В следующем примере сначала гарантируется проверка, objektне является ли " " не " null". Если это подвыражение ложно ( objektт.е. это пустая ссылка), правый операнд &&вообще не оценивается, т.е. ЧАС. метод inOrdnung()не ищется и даже не вызывается. Таким образом, общее выражение безопасно и никогда не может вызывать " NullPointerException". (" NullPointerException" Всегда выдается в Java при попытке nullразрешить ссылку на объект " ".)

if (objekt != null && objekt.inOrdnung()) {
    System.out.println("in Ordnung");
}
else {
    System.out.println("ungeprüft oder Prüfung misslungen");
}

Если вместо логических операторов &&и используются ||битовые операторы &и |, оба частичных результата должны быть связаны побитно, и обработка не может быть прервана с помощью выражения слева, если falseесть. Если переменная имеет objektзначение null, виртуальная машина Java пытается falseпобитно связать значение, полученное в результате первого выражения, с результатом второго выражения. Чтобы вычислить второе выражение, виртуальная машина пытается objektразыменовать и выдает одно NullPointerException.

Функциональные интерфейсы и лямбда-выражения

Лямбда-выражение - это безымянный (анонимный) метод, который может быть передан (как объект). Следовательно, лямбда-выражения описывают функциональные объекты. Этот термин восходит к лямбда-исчислению , формальному языку для исследования функций (см. Также функциональное программирование ). Лямбда-выражения в Java существуют со времен Java 8 и включают списки параметров, возвращаемый тип и тело:

(<Datentyp> <Variablenbezeichner>,...,<Datentyp> <Variablenbezeichner>) -> <Anweisungsblock>
(<Datentyp> <Variablenbezeichner>,...,<Datentyp> <Variablenbezeichner>) -> <Ausdruck>
(<Variablenbezeichner>,...,<Variablenbezeichner>) -> <Anweisungsblock>
(<Variablenbezeichner>,...,<Variablenbezeichner>) -> <Ausdruck>

Круглые скобки можно опустить, если количество содержащихся элементов равно одному. Спецификация типов параметров необходима только в том случае, если компилятор не может сам вывести их из контекста выражения. Функция, возвращающая сумму двух аргументов, может быть выражена следующим образом:

(i,j) -> i+j

Сами они не имеют определенного типа и поэтому могут использоваться только в контексте, который определяет тип, например вызовы методов, операторы возврата и инициализации переменных. Указанный тип должен быть функциональным интерфейсом. В следующем примере Comparator<String>объект определяется с помощью лямбда-выражения. В sortэффектах вызова сортировка someStringsпо их длине, в порядке убывания.

List<String> someStrings = ...
Collections.sort(someStrings, (x,y) -> y.length() - x.length());

Лямбда-выражения помогают избежать часто трудных для чтения длинных объявлений внутренних анонимных классов.

В Java интерфейсы, которые имеют только одну операцию (абстрактный метод), называются функциональными интерфейсами . Однако абстрактный класс с абстрактным методом не является функциональным интерфейсом.

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

<Klassenreferenz>::<Methodenbezeichner>
<Ausdruck>::<Methodenbezeichner>

В следующем коде ссылка на метод используется System.out::printlnкак java.util.function.Consumer<String>объект.

static <A> Consumer<A> doTwice(Consumer<A> consumer) {
    return a -> {
        consumer.accept(a);
        consumer.accept(a);
    };
}
static void foo() {
    doTwice(System.out::println).accept("Hello");
}

Комментарии

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

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

Пример:

 int i = 10; // Zeilenkommentar: hier bekommt die Variable i den Wert 10 zugewiesen.
 int j = 0;

/* Blockkommentar: hier beginnt eine While-Schleife
....
j wird um Eins erhöht, solange j kleiner i ist.*/
 while (j < i) {
  j++;
 }

Система Javadoc часто используется для документирования целых методов или классов .

Общее программирование

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

веб ссылки

Индивидуальные доказательства

  1. Скотт Стэнчфилд: Java - это ценность, черт возьми! JavaDude.com, доступ к 5 ноября 2010 .
  2. Типы, значения и переменные. (Больше не доступно в Интернете.) В: Спецификация языка Java. Oracle (Sun), архивируются с оригинала марта 9, 2012 ; по состоянию на 6 ноября 2010 г. (на английском языке). Информация: ссылка на архив вставлена ​​автоматически и еще не проверена. Проверьте исходную ссылку и ссылку на архив в соответствии с инструкциями, а затем удалите это уведомление. @ 1@ 2Шаблон: Webachiv / IABot / docs.oracle.com
  3. Мартин Герлах: Инновации в Java SE 8 (Часть 1): Лямбда-выражения и методы по умолчанию В: Блог Neo Tech (создан 17 ноября 2014 г., по состоянию на 16 декабря 2016 г.).