Java Core - 1 Flashcards
(132 cards)
- Что такое ООП?
Объектно-ориентированное программирование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
● объектно-ориентированное программирование использует в качестве основных логических
конструктивных элементов объекты, а не алгоритмы;
● каждый объект является экземпляром определенного класса
● классы образуют иерархии.
Согласно парадигме ООП программа состоит из объектов, обменивающихся сообщениями.
Объекты могут обладать состоянием, единственный способ изменить состояние объекта - послать ему сообщение, в ответ на которое, объект может изменить собственное состояние.
Какие преимущества у ООП?
Преимущества ООП:
- Возможность легкой модификации (при грамотном анализе и проектировании)
- Возможность отката при наличии версий
- Более легкая расширяемость
- «Более естественная» декомпозиция (разделение целого на части) программного
обеспечения, которая существенно облегчает его разработку «слабая связанность кода».
- Сокращение количества межмодульных вызовов и уменьшение объемов информации,
передаваемой между модулями.
- Увеличивается показатель повторного использования кода.
Какие недостатки у ООП?
Недостатки ООП:
- Требуется другая квалификация
- Резко увеличивается время на анализ и проектирование систем
- Увеличение времени выполнения
- Размер кода увеличивается :interrobang:
- Неэффективно с точки зрения памяти (мертвый код - тот, который не используется)
-Сложность распределения работ на начальном этапе
- Себестоимость больше
- Скорость
Назовите основные принципы ООП.
Инкапсуляция, наследование, полиморфизм, абстракция,
Что такое инкапсуляция? (с примером)
Это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя, открыв только то, что необходимо при последующем использовании.
Модификаторы доступа (Access modifiers: private, default (package visible), protected, public) Геттеры и Сеттеры (Getters and Setters)
Пример – кондиционер (берем пульт включаем холод - запускаются разные процессы, кот. не показываются пользователю), пользователю на пульте показывается температура воздуха на выходе, остальное все скрыто.
Цель инкапсуляции — уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса.
Состояние объекта – это значение всех его полей. Объект не должен изменяться чем то из вне, кроме своих методов. Убрать возможность случайного/умышленного изменения объекта.
Что такое наследование?(С примером)
Наследование - свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью.
Наследование форма отношения «is a» (является). Класс наследника является классом предка, но класс предка не является классом наследника: собака – наследник животного, но животное не наследник собаки. Наследник – более «узкий» класс.
Пример: кондиционер наследуется от холодильной техники.
Есть одиночное и множественное наследование (класс наследуется от нескольких классов). В Jave множественное наследование ограничено. Проблема – ромбовидное наследование: у одного базового класса есть два наследника, а у наследника этих двух классов свой наследник, какая реализация попадет в последний – ХЗ.
Запретить наследование - public final class.
Делегирование – один класс вызывает другой класс, не связанный наследованием.
– это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью.
Класс, от которого производится наследование, называется предком, базовым или
родительским. Новый класс – потомком, наследником или производным классом.
class Employee extends Person {}
Что такое полиморфизм? (С примером
Полиморфизм - это свойство системы использовать объекты с одинаковым
интерфейсом без информации о типе и внутренней структуре объекта.
Все if –ы можно заменить на полиморфизм (способ рефакторинга).
Позволяет уменьшать размер программы.
Пример: интерфейс «охлаждать» имеет место в технике, холодное пиво)) и т.п.
Преимуществом полиморфизма является то, что он помогает снижать сложность программ,
разрешая использование одного и того же интерфейса для задания единого набора действий.
Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор языка
программирования. Отсюда следует ключевая особенность полиморфизма - использование
объекта производного класса, вместо объекта базового (потомки могут изменять родительское
поведение, даже если обращение к ним будет производиться по ссылке родительского типа).
Unit ref = new Refrigerator(“ref”, 24);
Полиморфная переменная, это переменная, которая может принимать значения разных типов,
а полиморфная функция - функция у которой хотя бы один аргумент является полиморфной
переменной. Выделяют два вида полиморфных функций:
- ad hoc, функция ведет себя по разному для разных типов аргументов (например, функция
draw() — рисует по разному фигуры разных типов);
- параметрический, функция ведет себя одинаково для аргументов разных типов (например,
функция add() — одинаково кладет в контейнер элементы разных типов).
Абстрагирование – это способ выделить набор общих характеристик объекта, исключая из
рассмотрения частные и незначимые. Соответственно, абстракция – это набор всех таких
характеристик. (телефон звонил в 19 веке и в 21, функция выделена из разных сложных процессов).
Объект-класс-абстрактный класс-Интерфейс (макс. уровень абстракции).
Что такое ассоциация, агрегация и композиция?
Ассоциация обозначает связь между объектами. Композиция и агрегация – частные случаи ассоциации «часть-целое».
Агрегация предполагает, что объекты связаны взаимоотношением «part-of» (часть).
Композиция более строгий вариант агрегации. Дополнительно к требованию «part-of»
накладывается условие, что экземпляр «части» может входить только в одно целое (или
никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в
несколько целых.
Расскажите про раннее (статическое) и позднее (динамическое) связывание.
Присоединение вызова метода к телу метода называется связыванием. Если связывание проводится компилятором (компоновщиком) перед запуском программы, то оно называется статическим или ранним связыванием (early binding).
В свою очередь, позднее связывание (late binding) – это связывание, проводимое непосредственно во время выполнения программы в зависимости от типа объекта. Позднее связывание также называют динамическим (dynamic), или связыванием на стадиивыполнения (runtime binding).
Для всех методов Java используется механизм позднего (динамического) связывания, если
только метод не был объявлен как final (приватные методы являются final по умолчанию).
SOLID
Принципы SOLID - это набор руководящих принципов, предложенных Робертом Мартином (также известным как Uncle Bob), которые помогают создавать более гибкие, понятные и легко поддерживаемые программные системы. Эти принципы спроектированы для облегчения разработки и сопровождения кода в объектно-ориентированных языках программирования. Вот основные принципы SOLID:
**Принцип единственной ответственности **(Single Responsibility Principle - SRP):
Каждый класс должен иметь только одну причину для изменения. Суть заключается в том, что класс должен быть ответственным только за один аспект функциональности.
Принцип открытости/закрытости (Open/Closed Principle - OCP):
Программные сущности, такие как классы, модули и функции, должны быть открыты для расширения, но закрыты для модификации. Это означает, что вы должны иметь возможность добавлять новую функциональность без изменения существующего кода.
Принцип подстановки Барбары Лисков (Liskov Substitution Principle - LSP):
Объекты базового класса должны быть заменяемыми объектами производного класса без изменения правильности программы. Если класс является подклассом другого класса, то его объекты должны вести себя так же, как объекты базового класса.
Принцип разделения интерфейса (Interface Segregation Principle - ISP):
Клиенты не должны зависеть от интерфейсов, которые они не используют. Это означает, что не следует насаждать классам зависимость от интерфейсов, которые они не используют.
Принцип инверсии зависимостей (Dependency Inversion Principle - DIP):
Модули верхнего уровня не должны зависеть от модулей нижнего уровня, а оба типа модулей должны зависеть от абстракций. Абстракции не должны зависеть от деталей; детали должны зависеть от абстракций. Это также подразумевает использование интерфейсов или абстрактных классов для определения общих концепций, а не зависимость от конкретных реализаций.
Соблюдение этих принципов помогает создавать более гибкий, расширяемый и поддерживаемый код, что особенно важно в больших и долгосрочных проектах.
Какая основная идея языка?
Кроссплатформенность, «написано/скомпилировано однажды, запускается везде» (compile once, run anywhere)
Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой компьютерной архитектуре, для которой существует реализация виртуальной Java-машины.
Байт-код Java — набор инструкций, исполняемых виртуальной машиной Java. Каждый код операции байт-кода — один байт. Используются не все 256 возможных значений кодов операций. 51 из них зарезервированы для использования в будущем.
За счет чего обеспечивается кроссплатформенность?
Java Virtual Machine (JVM) — виртуальная машина Java — основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM может также использоваться для выполнения программ, написанных на других языках программирования. Например, исходный код на языке Ada может
быть скомпилирован в байт-код Java, который затем может выполниться с помощью JVM.
Какие преимущества у java?
- Объектно-ориентированный: все является объектом. Дополнение может быть легко расширено
- Платформонезависимый
- Простой для понимания: основные концепции ООП
- Безопасным: методы проверки подлинности основаны на шифровании с открытым ключом.
- Архитектурно-нейтральным: компилятор генерирует архитектурно-нейтральные объекты формата файла, что делает скомпилированный код исполняемым на многих процессорах, с наличием системе Java Runtime.
- Портативный: архитектурно-нейтральный и не имеющий зависимости от реализации аспектов спецификаций — все это делает Java портативным. Компилятор в Java написан на ANSI C с чистой
переносимостью, который является подмножеством POSIX. - Прочный: прилагает усилия, чтобы устранить ошибки в различных ситуациях, делая упор в основном на время компиляции, проверку ошибок и проверку во время выполнения.
- Язык для распределенного программирования и комфортной удаленной совместной работы.
Специфическая для Java методология распределенных вычислений называется Remote Method Invocation (RMI). RMI позволяет использовать все преимущества Java: безопасность, независимость от платформы и объектно-ориентированное программирование для распределенных вычислений - Автоматическое управление памятью
- Многопоточность
- Стабильность и сообщество
Какие недостатки у Java?
- Платное коммерческое использование. Oracle с 2019 взимает плату за использование Java Standard Edition 8 в «коммерческих целях»
- Низкая производительность (из-за компиляции и абстракции с помощью виртуальной машины, очистки памяти, взаимная блокировка потоков)
- Отсутствие нативного дизайна для создания графического интерфейса пользователя (GUI). Есть Swing, SWT, JavaFX, JSF …но не катят.
- Многословный и сложный код. длинные, чрезмерно сложные предложения затрудняют чтение и просмотр кода. Как и естественные языки, многие языки программирования высокого уровня содержат лишнюю информацию.
- Что такое JDK? Что в него входит?
Комплект разработчика приложений на языке Java:
- компилятор Java (javac)
- стандартные библиотеки классов Java, примеры, документацию, утилиты (вспомогательная компьютерная программа в составе общего программного обеспечения для выполнения специализированных типовых задач, связанных с работой оборудования и операционной системы)
- исполнительную систему Java (JRE: Java Virtual Machine + библиотеки Java-классов).
Что такое JRE? что в него входит?
Java Runtime Environment (JRE среда выполнения для Java) — минимальная реализация виртуальной машины, необходимая для исполнения Java-приложений, без компилятора и других средств разработки: Java Virtual Machine + и библиотеки Java-классов.
- Что такое JVM?
Основная часть JRE. Исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM может также использоваться для выполнения программ, написанных на других языках программирования. Например, исходный код на языке Ada может быть скомпилирован в байт-код Java, который затем может выполниться с помощью JVM
Что такое byte code?
Промежуточное представление кода, в которое может быть переведена компьютерная программа автоматическими средствами. Машинно-независимый код низкого уровня, генерируемый транслятором из исходного кода - набор валидных (соответствующих спецификации Java) команд.
Что такое загрузчик классов (classloader)?
Загрузчик классов является частью JRE, которая динамически закгружает Java классы в JVM. Обычно классы загружаются только по запросу. Система исполнения в Java не должна знать о файлах и файловых системах благодаря загрузчику классов. Делегирование является важной концепцией, которую выполняет загрузчик.
Загрузчик классов отвечает за поиск библиотек, чтение их содержимого и загрузку классов, содержащихся в библиотеках. Эта загрузка обычно выполняется «по требованию», поскольку она не происходит до тех пор, пока программа не вызовет класс. Класс с именем может быть загружен только один раз данным загрузчиком классов.
При запуске JVM, используются три загрузчика классов:
* Bootstrap class loader (Загрузчик класса Bootstrap)
* Extensions class loader (Загрузчик класса расширений)
* System class loader (Системный загрузчик классов)
Загрузчик класса Bootstrap загружает основные библиотеки Java, расположенные в
папке <JAVA_HOME>/jre/lib. Этот загрузчик является частью ядра JVM, написан на нативном коде.
Загрузчик класса расширений загружает код в каталоги расширений (<JAVA_HOME>/jre/lib/ext, или любой другой каталог, указанный системным свойством java.ext.dirs).
Системный загрузчик загружает код, найденный в java.class.path, который сопоставляется с переменной среды CLASSPATH. Это реализуется классом sun.misc.Launcher$AppClassLoader.
Загрузчик классов выполняет три основных действия в строгом порядке:
* Загрузка: находит и импортирует двоичные данные для типа.
* Связывание: выполняет проверку, подготовку и (необязательно) разрешение.
o Проверка: обеспечивает правильность импортируемого типа.
o Подготовка: выделяет память для переменных класса и инициализация памяти значениями по умолчанию.
o Разрешение: преобразует символические ссылки из типа в прямые ссылки.
* Инициализация: вызывает код Java, который инициализирует переменные класса их правильными начальными значениями.
Пользовательский загрузчик классов
Загрузчик классов написан на Java. Поэтому возможно создать свой собственный загрузчик классов, не понимая тонких деталей JVM. У каждого загрузчика классов Java есть родительский загрузчик классов, определенный при создании экземпляра нового загрузчика классов или в качестве системного загрузчика
классов по умолчанию для виртуальной машины.
Что делает возможным следующее:
* загружать или выгружать классы во время выполнения (например, динамически загружать библиотеки во время выполнения, даже из ресурса HTTP). Это важная особенность для:
o реализация скриптовых языков;
o использование bean builders;
o добавить пользовательскую расширение;
o позволяя нескольким пространствам имен общаться. Например, это одна из основ протоколов CORBA / RMI;
* изменить способ загрузки байт-кода (например, можно использовать зашифрованный байт-код
класса Java);
* модифицировать загруженный байт-код (например, для переплетения аспектов во время загрузки при использовании аспектно-ориентированного программирования);</JAVA_HOME></JAVA_HOME>
Что такое JIT?
JIT-компиляция (англ. Just-in-time compilation, компиляция «на лету»), динамическая
компиляция (англ. dynamic translation) — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы
Что такое сборщик мусора? (Garbage collector)
Способ автоматического управления памятью.
Сборщик мусора (Garbage Collector) должен делать всего две вещи:
- Находить мусор - неиспользуемые объекты. (Объект считается неиспользуемым, если ни одна из сущностей в коде, выполняемом в данный момент, не содержит ссылок на него, либо цепочка ссылок, которая могла бы связать объект с некоторой сущностью приложения, обрывается);
- Освобождать память от мусора.
Работа сборщика мусора не бесплатная, она оплачивается ресурсами компьютера и задержками в выполнении программы.
Существует два подхода к обнаружению мусора:
* Reference counting;
* Tracing
Reference counting (подсчёт ссылок). Суть этого подхода состоит в том, что каждый объект имеет счетчик. Счетчик хранит информацию о том, сколько ссылок указывает на объект. Когда ссылка уничтожается, счетчик уменьшается. Если значение счетчика равно нулю, - объект можно считать мусором. Главным минусом такого подхода является сложность обеспечения точности
счетчика. Также при таком подходе сложно выявлять циклические зависимости (когда два объекта указывают друг на друга, но ни один живой объект на них не ссылается), что приводит к утечкам памяти.
Tracing (трассировка) - живыми могут считаться только те объекты, до которых мы можем добраться из корневых точек (GC Root) и те объекты, которые доступны с живого объекта. Всё остальное - мусор.
Существует 4 типа корневых точки:
* Локальные переменные и параметры методов;
* Потоки;
* Статические переменные;
* Ссылки из JNI.
Самое простое java приложение будет иметь корневые точки:
* Локальные переменные внутри main() метода и параметры main() метода;
* Поток который выполняет main();
* Статические переменные класса, внутри которого находится main() метод.
Таким образом, если мы представим все объекты и ссылки между ними как дерево, то нам нужно будет пройти с корневых узлов (точек) по всем рёбрам. При этом узлы, до которых мы сможем добраться - не мусор, все остальные - мусор. При таком подходе циклические зависимости легко выявляются. HotSpot VM использует именно такой подход.
Для очистки памяти от мусора существуют два основных метода:
* Copying collectors
* Mark-and-sweep
При copying collectors подходе память делится на две части «from-space» и «to-space», при этом сам принцип работы такой:
* Объекты создаются в «from-space»;
* Когда «from-space» заполняется, приложение приостанавливается;
* Запускается сборщик мусора. Находятся живые объекты в «from-space» и копируются в «to-space»;
* Когда все объекты скопированы «from-space» полностью очищается;
* «to-space» и «from-space» меняются местами.
Главный плюс такого подхода в том, что объекты плотно забивают память. Минусы подхода:
1. Приложение должно быть остановлено на время, необходимое для полного
прохождения цикла сборки мусора;
2. В худшем случае (когда все объекты живые) «form-space» и «to-space» будут
обязаны быть одинакового размера.
Алгоритм работы mark-and-sweep можно описать так:
* Объекты создаются в памяти;
* В момент, когда нужно запустить сборщик мусора приложение приостанавливается;
* Сборщик проходится по дереву объектов, помечая живые объекты;
* Сборщик проходится по всей памяти, находя все не отмеченные куски памяти и сохраняя их в «free list»;
* Когда новые объекты начинают создаваться они создаются в памяти доступной во «free list».
Минусы этого способа:
1. Приложение не работает пока происходит сборка мусора;
2. Время остановки напрямую зависит от размеров памяти и количества объектов;
3. Если не использовать «compacting» память будет использоваться не эффективно.
Сборщики мусора HotSpot VM используют комбинированный подход Generational Garbage Collection, который позволяет использовать разные алгоритмы для разных этапов сборки мусора.
Этот подход опирается на том, что:
* большинство создаваемых объектов быстро становятся мусором;
* существует мало связей между объектами, которые были созданы в прошлом и только что созданными объектами.
Как работает сборщик мусора?
Механизм сборки мусора - это процесс освобождения места в куче, для возможности добавления новых объектов.
Объекты создаются посредством оператора new, тем самым присваивая объекту ссылку. Для окончания работы с объектом достаточно просто перестать на него ссылаться, например, присвоив переменной ссылку на другой объект или значение null; прекратить выполнение метода, чтобы его
локальные переменные завершили свое существование естественным образом. Объекты, ссылки на которые отсутствуют, принято называть мусором (garbage), который будет удален.
Виртуальная машина Java, применяя механизм сборки мусора, гарантирует, что любой объект, обладающий ссылками, остается в памяти — все объекты, которые недостижимы из исполняемого кода, ввиду отсутствия ссылок на них, удаляются с высвобождением отведенной для них памяти.
Точнее говоря, объект не попадает в сферу действия процесса сборки мусора, если он достижим посредством цепочки ссылок, начиная с корневой (GC Root) ссылки, т.е. ссылки, непосредственно существующей в выполняемом коде.
Память освобождается сборщиком мусора по его собственному «усмотрению». Программа может успешно завершить работу, не исчерпав ресурсов свободной памяти или даже не приблизившись к этой черте и поэтому ей так и не потребуются «услуги» сборщика мусора.
Мусор собирается системой автоматически, без вмешательства пользователя или
программиста, но это не значит, что этот процесс не требует внимания вовсе. Необходимость создания и удаления большого количества объектов существенным образом сказывается на производительности приложений и если быстродействие программы является важным фактором, следует тщательно обдумывать решения, связанные с созданием объектов, — это, в свою очередь,
уменьшит и объем мусора, подлежащего утилизации.
Какие разновидности сборщиков мусора реализованы в виртуальной машине HotSpot?
Java HotSpot VM предоставляет разработчикам на выбор четыре различных сборщика мусора:
* Serial (последовательный) — самый простой вариант для приложений с небольшим объемом
данных и не требовательных к задержкам. На данный момент используется сравнительно редко, но на
слабых компьютерах может быть выбран виртуальной машиной в качестве сборщика по умолчанию.
Использование Serial GC включается опцией -XX:+UseSerialGC.
* Parallel (параллельный) — наследует подходы к сборке от последовательного сборщика, но добавляет параллелизм в некоторые операции, а также возможности по автоматической подстройке под требуемые параметры производительности. Параллельный сборщик включается опцией - XX:+UseParallelGC.
* Concurrent Mark Sweep (CMS) — нацелен на снижение максимальных задержек путем выполнения части работ по сборке мусора параллельно с основными потоками приложения. Подходит для работы с относительно большими объемами данных в памяти. Использование CMS GC включается опцией -XX:+UseConcMarkSweepGC.
* Garbage-First (G1) — создан для замены CMS, особенно в серверных приложениях, работающих на многопроцессорных серверах и оперирующих большими объемами данных. G1 включается опцией Java - XX:+UseG1GC.
Что такое Heap и Stack память в Java? Чем они отличаются?
Heap (куча) используется Java Runtime для выделения памяти под объекты и классы. Создание нового объекта также происходит в куче. Это же является областью работы сборщика мусора. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться из любой части
приложения.
Stack (стек) это область хранения данных также находящееся в общей оперативной памяти (RAM) только для одного потока. Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего
метода. Размер стековой памяти намного меньше объема памяти в куче. Стек в Java работает по схеме LIFO (Последний-зашел-Первый-вышел)
https://tproger.ru/translations/programming-concepts-stack-and-heap/
Различия между Heap и Stack памятью:
● Куча используется всеми частями приложения в то время как стек используется только одним потоком исполнения программы.
● Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится лишь ссылка на него. Память стека содержит только локальные переменные примитивных типов и
ссылки на объекты в куче.
● Объекты в куче доступны с любой точке программы, в то время как стековая память не может быть доступна для других потоков, только для одного потока.
● Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы.
● Если память стека полностью занята, то Java Runtime бросает исключение
java.lang.StackOverflowError. Если заполнена память кучи, то бросается исключение
java.lang.OutOfMemoryError: Java Heap Space.
● Размер памяти стека намного меньше памяти в куче.
● Из-за простоты распределения памяти, стековая память работает намного быстрее кучи.
Для определения начального и максимального размера памяти в куче используются -Xms и -Xmx опции JVM. Для стека определить размер памяти можно с помощью опции -Xss.
Размер стека задаётся при создании потока, и у каждой переменной есть максимальный размер, зависящий от типа данных, размер кучи ограничен оперативной памятью.
Верно ли утверждение, что примитивные типы данных всегда хранятся в стеке, а
экземпляры ссылочных типов данных в куче? Не совсем. Примитивное поле экземпляра класса хранится не в стеке, а в куче. Любой объект (всё,
что явно или неявно создаётся при помощи оператора new) хранится в куче.
Каким образом передаются переменные в методы, по значению или по ссылке?
В Java параметры всегда передаются только по значению, что определяется как «скопировать значение и передать копию». С примитивами это будет копия содержимого. Со ссылками - тоже копия содержимого, т.е. копия ссылки. При этом внутренние члены ссылочных типов через такую копию изменить возможно, а вот саму ссылку, указывающую на экземпляр - нет.
Какие примитивные типы данных есть в Java?
boolean, char, byte, short, int, long, float, double
boolean 1 bit NA false boolean bool = true;
char 16 bits Символы Unicode ‘\u0000′ или 0 char c = ‘A’;
byte 8 bits [-128,127] или [-2^7 to 2^7-1] 0 byte b = 10; byte b = 0b010;
short 16 bits [-32768,32767] 0 short s = 32; short s = ‘A’;
int 32 bits [-2147483648,2147483647] 0 int i = 10; int i = ‘A’;
long 64 bits [-2^63,2^63-1] 0 long l = 3200L; long l = 3200;
float 32 bits [-3.4E38, 3.4E38] 0.0f float f = (float) 12.34; float f = 12.34f;
double 64 bits [-1.7E308, 1.7E308] 0.0 double d = 12.34;
Что такое char? по умолчанию?
char — \u0000;
char - 16-разрядное беззнаковое целое, представляющее собой символ UTF-16 (буквы и
цифры)