Введение в программирование

Синтаксис Java

Классификация типов

  • Примитивные
    • Целочисленные
    • С плавающей точкой
    • Логический
    • void
  • Ссылочные
    • Объекты
    • Массивы

Целочисленные типы

Имя Биты Знак Обертка
byte8 да Byte
short16 да Short
int32 да Integer
long64 да Long
char16 нет Character

Классы-обертки

Литералы

  • Десятичный
    • -12345
  • Восьмеричный
    • 0123
  • Шестнадцатеричный
    • 0xf345
  • Бинарный (J7+)
    • 0b0101
  • С разделителями (J7+)
    • 0b0000_0001_0010_0011

Символьный тип. Литералы

  • Простые
    • 'a'
  • Escaped
    • '\\', '\'', '\"', '\r', '\n', ...
  • Восьмеричные
    • '\003'
  • Unicode escapes
    • '\u00a0'

Типы с плавающей точкой

Имя floatdouble
Биты 32 64
    Мантисса 23 52
    Экспонента8 11
Экспонента -126..127 -1022..1023
Обертка FloatDouble

Обертки

strictfp

  • Сопроцессор на 80 бит
    • Что делать?
  • Модификатор strictfp
    • Гарантирует вычисления по IEEE 754
    • Побитное совпадение
  • Применимость
    • Классы
    • Интерфейсы
    • Методы
  • Класс StrictMath

Логический тип

Void

  • Значения
    • Отсутствует
  • Обертка
    • Void
    • Экземпляры отсутствуют

Массивы

  • Объявление
    • int[][][]
    • Integer[][]
  • Создание
    • new Integer[3][]
    • new int[]{10, 20, 30}
  • Литералы
    • Integer[][] a = {{0, 1}, {2}}

Массивы как объекты

  • Массив это объект
    • Object o = new int[3];
  • Ковариантность
    • S :> TS[] :> T[]
  • Проблемы
    • String[] strings = new String[10];
      Object[] objects = strings;
      objects[0] = new Object();
      String string = strings[0];
      
  • Reifability

Объекты

  • Передаются по ссылке
    • Ссылка передается по значению
  • Обертки
    • Autoboxing
  • String

Boxing и Unboxing

  • Boxing (упаковка)
    • Заключение значения примитивного типа в обертку
      int a = …;
      new Integer(a)
      
  • Unboxing (распаковка)
    • Извлечение значения примитивного типа из обертки
      Integer a = …;
      a.intValue()
      

Autoboxing

  • Генерация кода для упаковки и распаковки при необходимости
  • Явное приведение типов
    • (Integer) 10
    • (int) new Integer(10)
    • (Object) 10
  • Приведение типов «по ходу»

Пример

  • Исходный код
    Integer i1 = 1;
    Integer i2 = 2;
    Integer i3 = i1 + i2;
    
  • Сгенерированный код
    Integer i1 = Integer.valueOf(1);
    Integer i2 = Integer.valueOf(2);
    Integer i3 = Integer.valueOf(i1.intValue() +
        i2.intValue());
    

Особенности Autoboxing

  • Обработка null при распаковке
  • Сравнение на равенство (== и !=)
    • Примитивные типы сравниваются по значению
    • Обертки сравниваются по ссылке
  • Сравнение по порядку (<, <=, >, >=)
    • Всегда по значению
  • Снижение производительности

Операции

Содержание

Общие правила

  • Вычисляются слева направо
  • Все аргументы вычисляются до операции
    • Кроме ||, && и ?:
  • Действуют для вызова функций

Приоритет 1 (наивысший)

  • Основные
    • литерал
    • переменная
    • this
    • (выражение) (ClassCastException)
    • new
    • a.b
    • a.b()
    • a[b]
  • Ассоциативность: левая

Приоритет 2

  • Пост инкремент и декремент
    • выражение++
    • выражение−−
  • Ассоциативность: отсутствует

Приоритет 3

  • Унарные операции
    • ++выражение
    • −−выражение
    • +выражение
    • выражение
    • ~выражение
    • (тип) выражение
  • Ассоциативность: правая

Приоритет 4

  • Мультипликативные
    • *
    • /
    • %
  • Целочисленное деление
    • Округление к нулю
    • [a / b]0* b + a % b == a
  • Ассоциативность: левая

Приоритет 5

  • Аддитивные
    • +
    • + (конкатенация)
  • Ассоциативность: левая

Приоритет 6

  • Сдвиги
    • << (a << n == a∙2n)
    • >> (a >> n == a/2n)
    • >>> (битовый)
  • Ассоциативность: левая

Приоритет 7

  • Сравнения
    • <
    • >
    • <=
    • >=
    • instanceof
  • Ассоциативность: отсутствует

instanceof

  • Проверка приведения типа
  • выражение instanceof Тип
    • Тип t = (Тип) выражение; – безопасно
  • Только для ссылочных типов
  • Обработка null
    • null instanceof Типfalse

Приоритет 8

  • (Не) равенство
    • ==
    • !=
  • Ассоциативность: левая
  • Ссылочные типы
    • Сравнение ссылок

Приоритеты 9-11

  • Побитовые операции
    • &
    • ^
    • |
  • Ассоциативность: левая

Приоритеты 12-14

  • Логические операции
    • &&
    • ||
  • Ассоциативность: левая
  • Тернарный оператор
    • условие ? выражениеt : выражениеf

Приоритет 15

  • Присваивания
    • =
    • @= (a = (тип a) (a @ выражение))
  • Ассоциативность: правая

Операторы

Содержание

Простые операторы

  • Пустой
    • ;
  • Выражение
    • выражение;
  • Блочный
    • { }
  • Опредение переменной

Опредение переменной

  • Синтаксис
    • [final] тип a [= выражение];
  • Модификатор final
    • Определено ровно один раз
    • final int a;
      final int b;
      if (условие) {
          a = 1;
          b = 10;
      } else {
          a = 3;
          b = -2;
      }
      

Условный

  • Простой
    • if (условие) оператор
  • Полный
    • if (условие) операторt else операторf

Ветвление

  • Типы
    • Целочисленные
    • Строки
    • Перечисления
      switch (input) {
          case 'y': case 'Y':
              return true;
          case 'n': case 'N':
              return false;
          default:
              // Error?
              break;
      }
      

Циклы

  • С предусловием
    • while (условие) оператор
  • С постусловием
    • do оператор while (условие);
  • For
    • for (инициализация; условие; инкремент) оператор
  • Расширенный for
    • for (тип переменная : выражение) оператор
    • Массивы
    • Iterable

Переходы

  • Прерывание
    • break [метка];
  • Продолжение
    • continue [метка];
  • Метки
    • метка: оператор
  • Возврат
    • return [выражение];

Исключения

  • Бросок
    • throw выражение;
  • try-catch-finally
    try { … }
    catch (…) { … }
    catch (…) { … }
    finally { … }
    

Утверждения

  • Синтаксис
  • Действия в условии
    • Не надо
  • Включение проверок
    • java -ea – пользовательских
    • java -esa – системных
    • java -ea:пакет... – в пакете
    • java -ea:класс... – в классе

Исходный код

Содержание

Структура файла

  • Определение пакета
    • Не обязательно
    • package полное.имя;
  • Импортирование
    • Возможно несколько
    • import полное.имя.класса;
    • import полное.имя.пакета.*;
    • import static класс.член;
    • import static класс.*;
  • Определение классов и интерфейсов

Определение интерфейса

  • Синтаксис
    [доступ] [abstract] [strictfp] interface Name
    [extends Interface1, Interface2] {
        // Поля и методы
    }
    
  • Методы
    [public] [abstract] тип имя(аргументы);
    
  • Методы по умолчанию (J8+)
    [public] default тип имя(аргументы) { … }
    

Поля интерфейса

  • Поля
    [public] [static] [final] тип ИМЯ [= выражение];
    
  • Инициализация
    static { … } 

Определение класса

  • Синтаксис
    [доступ] [abstract|final] [static] [strictfp]
    class Name [extends Parent]
    [implements Interface1, Interface2] {
        // Поля
        // Инициализаторы
        // Конструкторы
        // Методы
        // Вложенные классы
    }
    

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

  • Синтаксис
    [доступ] [static] [final] тип имя [= выражение];
    
  • Инициализатор
    { … } 

Определение конструктора

  • Обычный
    [доступ] [strictfp]
    имя([final] Тип₁ арг₁, [final] Тип₂ арг₂, …) {
        [super(…)|this(…)]
        …
    }
    
  • final поля
    • Определены в super-конструкторах и инициализаторах
    • Не изменяются в this-конструкторах
  • final аргументы
    • Не изменяются

Определение метода

  • Обычный
    [доступ] [static] [final] [strictfp] [native]
    Тип имя(аргументы)
    { … }
    
  • Абстрактный
    [доступ] [abstract] Тип имя(аргументы);
    

Вложенные и внутренние классы

  • Внутренние
    • class Внешний {
          class Внутренний {
              // Доступ Внешний.this
          }
      }
      
    • внешний.new Внутренний(…)
      
  • Вложенные
    • class Внешний {
          static class Вложенный {
              // Нет доступа к Внешний.this
          }
      }
      

Локальные и анонимные классы

  • Локальный класс
    • Доступен в области видимости
    • void method() {
          class Local { … }
      }
      
  • Анонимный класс
    • Не доступен по имени
    • Shape shape = new AbstractShape() { … }
      

Заключение

Содержание

Ссылки

Вопросы

???

Соглашения о вызовах

Содержание

Вызов по значению

  • Call-by-value
    • Передается копия значения
  • Примитивные типы
    • Всегда копируются
  • Ссылочные типы
    • Очень дорого
    • Call-by-value для ссылок

Вызов по ссылке

  • Call-by-reference
    • Передается ссылка на значение
    • Значение можно изменить
  • Защитное копирование
    • Очень дорого

Вызов по имени

  • Call-by-name
    • Передается выражение
    • Значение вычисляется при использовании
  • Эффективность
    • Программные конструкции
  • Неэффективность
    • Экспоненциальный рост

Вызов по требованию

  • Call-by-need
    • Ленивые вычисления
    • Передается выражение
    • Значение вычисляется при первом использовании
  • Эффективность
    • Программные конструкции
    • Накладные расходы