JavaRush /Курсы /Java Syntax /Жесткая типизация

Жесткая типизация

Java Syntax
10 уровень , 1 лекция
Открыта

— Привет, Амиго!

— Привет, Элли!

— Сегодня у меня хорошее настроение, поэтому расскажу тебе кое-что интересное. И начну я с типизации примитивных типов в Java.

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

Код на Java Описание
int a = 11;
int b = 5;
int c = a / b; // c == 2
a / b – это деление нацело. Ответом будет два. Остаток от деления просто отбрасывается.
int a = 13;
int b = 5;
int d = a % b; // d == 3
В d будет храниться остаток от деления a на b нацело. Остаток равен 3.

— Но есть и пара интересных нюансов, которые следует помнить.

— Во-первых, ссылочная переменная не всегда хранит значение такого же типа, как и она.

— Во-вторых, при взаимодействии переменных двух разных типов, они должны быть сначала преобразованы к одному общему типу.

— А как же деление? Если разделить 1 на 3, мы получим 0.333(3). Ведь так?

— Нет не так. При делении двух целых чисел, результатом тоже будет целое число. Если разделить 5 на 3, то ответом будет 1 и два в остатке. Остаток при этом отбрасывается.

— Если разделить 1 на 3, то мы получим 0 (и единицу в остатке, который отбросится).

— А что делать, если я все же хочу получить 0.333 ?

— В Java числа перед делением лучше всего приводить к вещественному (дробному) типу путем умножения их на вещественную единицу – 1.0

Код на Java Описание
int a = 1/3;
a будет содержать 0
double d = 1/3;
 d будет содержать 0.0
double d = 1.0 / 3;
d будет содержать 0.333(3)
double d = 1 / 3.0;
d будет содержать 0.333(3)
int a=5, b=7;
double d = (a*1.0) / b;
d будет содержать 0.7142857142857143

— Понятно.

10
Задача
Java Syntax Pro, 10 уровень, 1 лекция
Недоступна
Целочисленные литералы
В классе Solution объявлены четыре публичных поля, которые соответствуют четырем целочисленным типам. При объявлении эти поля инициализируются разными значениями - целочисленными литералами. Но программа не компилируется, и нужно это исправить. Для этого внеси минимальные изменения в значения полей
10
Задача
Java Syntax Pro, 10 уровень, 1 лекция
Недоступна
Литералы с плавающей точкой
В классе Solution объявлены и проинициализированы семь публичных полей. Они инициализируются разными значениями - литералами с плавающей точкой. Но программа не компилируется, и нужно это исправить. Для этого измени типы полей, чтобы они соответствовали значениям. Имена и значения полей не изменяй.
10
Задача
Java Syntax Pro, 10 уровень, 1 лекция
Недоступна
Строковые литералы
В классе Solution объявлено и проинициализировано публичное строковое поле. Но строка слишком длинная и неудобочитаемая. Для лучшей читаемости нужно разделить её на 5 подстрок и склеить их "оператором +" (конкатенация строк) в таком виде: - первая строка: "Всегда пишите код так, " - вторая строка: "
10
Задача
Java Syntax Pro, 10 уровень, 1 лекция
Недоступна
Символьные литералы
В классе Solution объявлены четыре публичных символьных поля. Им присвоены некоторые значения. Но программа не компилируется. Нужно это исправить, не меняя значения символов. Все поля статические (static) - это нужно, чтобы в методе main() получить к ним доступ. На результат можно посмотреть, запуст
Комментарии (121)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
8 октября 2024
08.10.2024 check, мой уровень 10
2 апреля 2024
Людей всё меньше.
Денис Уровень 16
14 января 2023
приувет
BOB Уровень 18
24 сентября 2022
при делении с целыми числами, допустим double a = 1/3, сначала получается 0,333333 и сразу после деления отбрасывается дробная часть и остаётся 0, но поскольку у нас тип double, то окончательный ответ будет 0.0. Если было бы double a = 1.0/3.0, тогда получилось бы 0,33333 в ответе
Anonymous #823528 Уровень 16
19 сентября 2022
Т.е. когда я себе в одной из ранних задач чуть не сломал мозг, когда 3 разделил на 2 и получил 1 -- нельзя было это донести?)
Burnoutman Уровень 13
5 августа 2022
Можно ещё так писать

double c=1/3d;
Anonymous #2772220 Уровень 14
26 августа 2021
Никогда бы не подумал, что при таком объявлении переменной double d = 1/3; d будет содержать 0.0
Kuksh Уровень 15
7 мая 2021
То есть получается, если мы создаем калькулятор или работаем с денежными и так далее операциями, где нам важен остаток - мы обязаны задавать явно double name = num1 * 1.0 / num2; Получается, если не задавать 1.0, то будет ошибка по умолчанию? А почему тогда зная это правило в IDEA не вшили в класс Double от которого наследуется получается тип double - уже этот алгоритм домножения, чтобы мы могли сразу писать 1 / 3 = 0,3333(3) ?
Сергей Уровень 22
5 декабря 2021
Думаю что это связано с тем, что не всегда нужно получить результат в виде дроби, в каких-то случаях нужны именно целые числа. А как объяснить классу какой результат нам нужен: целый или дробный, поэтому видимо и решили что всегда оперируем с теми типами которые объявлены и переданы в метод.
12 августа 2022
IDEA - это интегрированная среда разработки, которая содержит инструменты и компилятор. Этот компилятор просто обязан соответствовать требованиям стандарта языка JAVA, чтобы программы, написанные на этом языке, вели себя так, как прописано в большой пачке документов, хранящихся совершенно в другой конторе. Если они начнут менять поведение языка по своему усмотрению - то им и по шапке надают, и авторитет у программистов потеряют. А потом - кто тебе сказал, что это поведение программы неправильное? Сперва происходит деление двух целых чисел, результат которого - целое число! В некоторых случая нужно именно деление без остатка, и убирать такую возможность, если ты не понимаешь логики, нет смысла. Проще, наверное, тебе явно указать компилятору - что ты хочешь, чем переписывать все написанные до того программы, использующие правила деления целых чисел под новый лад!
piersto Уровень 17
26 апреля 2021
double d = 1/3; d будет содержать 0.0 Не понял почему. 🤔
Дмитрий Уровень 16
26 апреля 2021
Это простая переменная с плавающей точкой. Т.е. ты делишь целое число, на целое число отсюда 0.0. Чтобы было как надо, надо либо в делителе, либо в делимом указывать числа после запятой, как ниже сделано.

double 100/100 = 0.0

double 100.0/100 = 1.0
koshi Уровень 1
3 августа 2021
Сначала делится 1 на 3, получается 0, остаток выбрасывается, затем 0 приводится к типу double и присваивается double d. Получается d == 0.0. В следующих примерах число сначала преобразуется в double (второе следом за ним автоматически), затем 1.0 делится на 3.0, получается 0.333(3). И уже только после этого результат присваивается double d.
Александр Уровень 14
14 марта 2021
В Java числа перед делением лучше всего приводить к вещественному (дробному) типу путем умножения их на вещественную единицу – 1.0 А зачем?
Wiun Уровень 16
15 апреля 2021
чтобы при делении 4 на 3 получить не 1, а 1,33(3)
Александр Уровень 14
16 апреля 2021
ну в таблице это видо. но хотелось бы более полной инфы как это работает. т.е. компилятор будет работать как с интами есил 1 делить на 3, не смотря на то, что тип переменной в которой это происходит double ?