Каква е разликата между int и Integer?

+8 гласа
597 прегледа
попитан 2016 май 25 в Java от JavaDevF (280 точки)
Здравейте, от скоро уча програмиране и не ми е известна напълно разликата между int и Integer освен, че int е примитивен тип, а Integer е обект, wrapper class, който обвива примитивния тип int, като му добавя допълнителни функционалности. Обяснете повече за разликата.

1 отговор

+1 глас
отговорени 2016 май 25 от Daniel Ivanov (11,140 точки)
избран 2016 май 26 от JavaDevF
 
Най-добър отговор

Привет,

Точно така – int е примитивен неизменен тип, на който се задава някаква стойност и обикновено се разпределя от stack-а, докато обектите като Integer осигуряват наличието на полиморфизъм и се задават с референции (или по-точно имат референции, подадени с помощта на някакви стойности), и се складират в хийпа (heap).

Полиморфизъм – свойството на обектите от един и същи тип да имат един и същи интерфейс, но с различна реализация на този интерфейс .

Нещата за примитивни и обекти се обясняват в книжките за програмиране заедно с алокацията на място за елементите – stack & heap.

Добре е да се знае какво е стак (stack) и какво е heap (хийп) . Стака и Хийпа имат по 2 значения –като структура от данни и като организация на паметта.

Като организация на паметта стека е обособена част от паметта, използвана за предаване на параметри и съхранение на локалното състояние при call-ване (извикване) на подпрограма. В зависимост от платформата, стека може да е предварително определен като големина и/или местоположение или да се определя динамично по време на изпълнение на програмата.

Стек като структура от данни

 Kак работи самия стак: представи си купчина от елементи да кажем тетрадки, които са 1 върху друга. Има 2 действия, който могат да се извършват – push и pop. Push слага 1 тетрадка над най-горната, а pop маха последно добавената тетрадка, която не е махната все още. Има алтернативно име – LIFO (last in, first out), тоест последния добавен се маха първи; има и peek (надничане) – дава ти възможността да видиш стойността на последно добавеният елемент ... но това е друг въпрос. Също така когато се напълни 1 такъв стак и няма място за повече елементи, се казва stack-а се е overflow-нал , тоест е препълнен.

Та, понеже работи на принципа last in, first out, алокацията (разпределнието) на паметта е много проста и обикновено по-бърза от тази на хийпа, която сега ще спомена.

Хийп като структура от данни е дървовидна структура от данни, съхраняваща подредени елементи, които изпълняват условието, че всеки възел е по-голям или равен на кой да е от наследниците си.

Хиип като организация на паметта е обособена част от паметта, от която се заделят блокове памет по време на изпълнението на програмата (т.нар. динамична памет).

Ако искаш напиши в гугъл “stack” и после “heap” да видиш нагледно, че представляват точно това и да можеш по-лесно да го осмислиш.

Така след като минахме теоретичната част, малко код нагледно:

Като създадеш обект “i” от Integer:

Integer i = new Integer(1);

Можеш да извикаш метод на i:

String string = i.toString(); //задава на string i под формата на стринг

Докато на int като си направиш

int i = 1;

Не можеш да викаш никакви методи, понеже си е просто примитивна =>

String string = i.toString(); // няма как да работи

и ти дава грешка, понеже int не е обект.

Ще обясня и по друг начин:

Спомена че класовете са wrappers – тоест енкапсулират числото (примитивния тип данна), а самите те не са примитивни.

byte, int, char, boolean, double, float, short, long – примитивни;

Byte, Integer, Character, Boolean, Double, Float, Short, Long – wrapper класове – служат за енкапсулация на примитивните, така че тези типове да могат да се използват за създаване на обекти (инстанции) и методи в други класове, които се нуждаят от тези типове. 

...