Чем отличается Integer[] array от int[]array ?
И для чего это делается? Integer[] array = new Integer[5]
Спасибо!
Boris
23 уровень
Чем отличается Integer[] array от int[]array ?
Обсуждается
Комментарии (11)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Gans Electro
28 сентября 2022, 12:55
int array[] это массив примитивных типов целых чисел. Integer array[] массив Объектов типа Integer. Integer это класс обертка, по сути тот же int но это объект. Смотря от применения очень много пунктов почему в некотором роде нужен объект или примитивый тип. В 13 лекций у меня как раз по него говорят
+1
hidden #598481
28 сентября 2022, 13:55
Принципиальных моментов между этими типами два.
Поскольку Integer - это ссылочный тип, то переменная этого типа может быть инициализирована значением null. Это ключевое отличие, потому что переменная типа int может быть инициализирована только фактическим значением (числом). В контексте работы с массивами при создании массива обёрток создаётся массив, содержащий null-ы, в то время как при создании массива примитивов создаётся массив нулей:
Второе принципиальное отличие заключается в том, что только ссылочные типы данных можно использовать в качестве дженериков и хранить в коллекциях.
+2
Boris
29 сентября 2022, 21:33
Спасибо большое! По моему на этом курсе на уроках периодически вставляют ещё не изученный материал. А на уроке 8.4 (Объекты в Java) вообще многое недоговаривают.
Если можно, ещё несколько вопросов хотел бы задать:
Урок 8.4 (Объекты в Java).
1. На одной странице (файле) можно создавать только один класс?
2. В чём фишка данного объекта? Вроде всё, что тут ест можно было сделать без создания массива типа Класса. Вроде можно было создать массив типа int. Никак не пойму в чём суть объекта.
3. Как инициализировать элементы массива Solution[] data ? В данном примере мы инициализируем четыре переменные, но элементы массива не трогаем.
3. Если переменные static, то лучше делать так: Solution.x Вместо data[i].x ??
Но реально работает правильно в обоих вариантах, так ?? Когда я создавать переменные не в том же файле, то работали оба варианта Solution.x и data[i].x и когда переменные были static и не static. В том же файле (классе) Static работал только с обоими вариантами, а не static только с вариантом Solution.x. Так и должно быть?
class Solution
{
int x;
int y;
int color;
String a = "Hello!";
public static void main(String[] args)
{
Solution[] data = new Solution[10];
for (int i = 0; i < data.length; i++) {
data[i] = new Solution();
data[i].x = i + 3; // Если переменные static, то лучше делать так: Solution.x Вместо data[i].x ??
data[i].y = i + 8; // Но реально работает правильно в обоих вариантах, так ??
data[i].color = i + 12;
System.out.println("Цвет точки x=" + data[i].x + ", y=" + data[i].y + " " + data[i].color + " " + data[i].a);
}
}
}
Спасибо большое!
0
ГоффMaster
29 сентября 2022, 23:15
Добавлю ещё важное отличие, на котором многие по началу путаются.
Сравнивать int можно напрямую:
С Integer, что самое плохое, результат не однозначен. Если значения обоих в пределах от -128 до 127, то это будет работать, а если нет - то нет.
0
ГоффMaster
29 сентября 2022, 23:18
Значения объектов надо всегда сравнивать методом equals:
0
hidden #598481
30 сентября 2022, 10:51
На одной странице (файле) можно создавать только один класс?
Не совсем так.
Бывают внутренние (inner) и вложенные (nested) классы, ещё в одном файле можно написать несколько классов последовательно, но только один внешний класс может быть публичным. Общая структура может быть такой:Это может быть текст класса ExternalPublicClass, и такие классы могут быть в нём описаны. Но это всё довольно редко используется, гораздо чаще один файл = один публичный класс.
2. В чём фишка данного объекта? Вроде всё, что тут ест можно было сделать без создания массива типа Класса. Вроде можно было создать массив типа int. Никак не пойму в чём суть объекта.
Всё становится понятнее, когда осознаёшь, что класс описывает схему того, что представляет собой объект этого класса. То есть в твоём примере каждый объект - это точка, которая имеет две координаты x и y, и цвет color. То есть совокупность этих трех характеристик определяет каждый объект типа точка: допустим, первая точка (1; 1) с цветом "Blue", вторая точка (3; 0) с цветом "Red" и т.д. И чтобы иметь возможность сопоставить каждый набор координат с цветом и назвать это "точкой", ты описываешь класс точек:
Вот и готов простенький класс.
0
hidden #598481
30 сентября 2022, 10:51
Теперь его можно использовать в других классах. Ты можешь конечно сразу сказать, какое MyApp, какое Points, у меня тут только один класс Solution. К этому мы вернёмся чуть позже, давай сначала посмотрим на код в методе main и выполним его. Сложные места я объяснил в комментариях в коде. Ключевой смысл заключается в том, что мы создаём массив из пяти точек и добавляем в него пять точек, которые создаём. Каждая точка имеет случайный набор координат и один из пяти возможных цветов. Для этого мы используем вспомогательные инструменты: массив с цветами и генератор случайных чисел.
Выполним программу, и получим примерно такой вывод:
Точка №0: (2; -3), цвет - Yellow
Точка №1: (0; 2), цвет - Green
Точка №2: (0; -3), цвет - Blue
Точка №3: (1; 3), цвет - Purple
Точка №4: (4; -4), цвет - Purple
Понятно, что координаты и цвета будут каждый раз разные.
0
hidden #598481
30 сентября 2022, 10:51
Теперь о том, почему я сделал два отдельных класса вместо одного Solution, как у тебя. На мой взгляд, так проще понять, за что отвечает класс. Вот мы описали класс Point, он в точности повторяет содержимое твоего класса Solution, только называется по-другому. И название теперь отражает содержимое, становится понятно, что каждый объект - это “точка” ("point"), а не “решение” ("solution"). То есть по сути первое, что я сделал - это просто переименовал класс Solution в Point.
Второе - это метод main. Вообще метод main можно написать абсолютно в любом классе. Он статический, а это значит, что у него нет прямого доступа к нестатическим полям этого класса, для этого будут требоваться объекты, что ты и делаешь в своём коде - создаёшь объекты Solution. Необязательно писать код в методе именно того класса, объекты которого ты создаёшь, ведь ты не пишешь код внутри класса String, чтобы создавать объекты типа String. Поэтому я предпочёл вынести метод main в отдельный класс, т.е. создал класс, который отвечает только за запуск программы. Поскольку метод main статический, нам не будет требоваться создавать объекты этого класса, и это не будет лишний раз путать. Обычно этому классу дают какое-то общее название, которое в целом ничего конкретного не значит - “Main”, “Application”, “App”, “Solution” и т.д., т.е. просто “приложение”, "главный класс", "решение [задачи]". Я назвал его MyApp, просто потому что.
Поскольку, как я сказал, метод main может находиться в любом классе, ты можешь перенести его обратно в Point (который переименованный Solution), и всё будет работать точно так же. Я сделал это просто для того, чтобы было понятно, что метод main и остальное содержимое класса друг от друга не зависят.
0
hidden #598481
30 сентября 2022, 10:52
3. Если переменные static, то лучше делать так: Solution.x Вместо data[i].x ??
Но реально работает правильно в обоих вариантах, так ?? Когда я создавать переменные не в том же файле, то работали оба варианта Solution.x и data[i].x и когда переменные были static и не static. В том же файле (классе) Static работал только с обоими вариантами, а не static только с вариантом Solution.x. Так и должно быть?
В примере, когда метод main и остальное содержимое класса разнесены по разным классам, это тоже становится немного очевиднее. Что это будет означать, если поля в классе Point сделать статическими? Это будет значить, что каждое поле отныне относится не к одному конкретному объекту класса Point, принимая для каждого объекта своё значение, а ко всему классу Point сразу, ко всем его объектам одновременно. То есть у точек исчезнут их собственные координаты и цвета, а меняя значение, неважно, через Point.x или через point[i].x, ты будешь менять это значение для всех точек сразу.
То есть когда поле статическое, если сначала написать point[0].x = 5, а потом point[1].x = -1, то у point[0] никакого значения 5 после этого не останется, оно будет равно -1, потому что это самое “.x” относится не к конкретному объекту, а ко всему классу объектов сразу. А в твоём коде это просто никак не отражается, потому что ты производишь вывод одновременно с тем, как меняешь значение. Другими словами, происходит следующее:
Всем точкам меняем цвет на чёрный.
Выводим информацию, что точка 0 - чёрная.
Всем точкам меняем цвет на жёлтый.
Выводим информацию, что точка 1 - жёлтая.
И так далее. То есть выводимая информация не отражает действительного состояния вещей. Именно по этой причине я в своём коде вынес вывод информации в отдельный цикл. В этом случае ты бы сам увидел разницу, в чём отличие использования статических переменных и нестатических.
Надеюсь, доступно объяснил. Спрашивай, если остались вопросы.
0
Boris
3 октября 2022, 10:51
Спасибо большое!
0
Gans Electro
4 октября 2022, 10:05
В 8 лекций дали для того чтобы глаза привыкли. Понимание приходит с опытом, и есть целый под них
0