В Java все объекты хранятся в области Heap. Это принципиальное отличие от C++ где объекты могут храниться в памяти, или в стэке, или в области Heap. В C++, когда создается новый объект с помощью функции new(), то он создается в области Heap, иначе создается в стэке, если он не gloval и static.

В Java, когда мы определяем переменную с типом класса, создается только ссылка (память для этого не выделяется). Чтобы выделить память для объект, необходимо создать его с помощью new(). Таким образом для этого объекта будет выделена память в области Heap.

Пример как хранятся Java объекты

Рассмотрим пример (Будет ошибка, потому что объект еще не создан):

class Test {
    // class contents
    void show() {
        System.out.println("Test::show() called");
    }
}
 
public class Main {
    public static void main(String[] args) {
        Test t; 
        t.show(); // Error here because t is not initialed
    }
}

Выделяем память, используя new() и теперь ошибки не будет.

class Test {
    // class contents
    void show() {
        System.out.println("Test::show() called");
    }
}
  
public class Main {
    public static void main(String[] args) {
        Test t = new Test(); //all objects are dynamically allocated
        t.show(); // No error 
    }
}

Это статья является переводом этой статьи.