Разница между эталонным значением и примитивным значением - PullRequest
0 голосов
/ 22 октября 2019

Объекты являются ссылочным типом, что означает, что ссылочный тип объекта содержит адрес в памяти, где хранятся фактические данные.

Например,

Integer object = new Integer(3);

Но если говорить о примитивных типахНапример, int number = 3;, куда number указывает?

Это само по себе в памяти? Что он держит?

Ответы [ 3 ]

2 голосов
/ 22 октября 2019

В Java есть нечто, называемое стековой памятью, где хранятся все примитивы.

Было похожее обсуждение, которое вы можете посетить, перейдя по этой ссылке

Где находится JVM? хранить примитивные переменные?

0 голосов
/ 22 октября 2019

Тип примитива может храниться как в стеке, так и в куче, в зависимости от области его применения.

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

См. Пост Идут ли примитивы Java в стеке или куче? и Память стека и пространство кучи в Java

class Person {
    int pid;
    String name;

    // constructor, setters/getters
}

public class Driver {
    public static void main(String[] args) {
        int id = 23;
        String pName = "Jon";
        Person p = null;
        p = new Person(id, pName); // primitive in heap
    }
}

Пример типа примитива в куче: когда p назначается с конструктором Person, в памяти кучи создается новый экземпляр класса Person, у которого значение куска памяти равно 23.

0 голосов
/ 22 октября 2019

Примитивные типы данных хранятся в стеке , а эталонные типы данных хранятся в куче .

Поэтому, когда вы говорите int number=3;, 32-бит длинный (по умолчанию) кусок памяти в стеке откладывается. Этот блок содержит значение 3 и может быть идентифицирован по имени переменной число .

Но когда вы говорите Integer object = new Integer(3);, память назначается из кучи и ссылки создан для этого куска памяти. Эта память предназначена для экземпляра object класса Integer, поэтому она получает больше памяти, чем ваш int number. Это связано с тем, что класс Integer включает в себя не только примитив int , но также некоторые другие методы, которые можно использовать в его экземплярах.

Вы также должны понимать, что при передачепримитивный тип данных для оператора присваивания или для функции, он передается копией , поэтому изменения не отражаются на исходной переменной. Но если вы передаете объект Integer, он передается по ссылке , то есть по указателю на этот большой кусок памяти в куче, поэтому изменения видны на реальном объекте.

...