Все, что метод помещает в стек, исчезнет при выходе из метода. В .net и Java было бы вполне приемлемо (фактически желательно), если бы объект класса исчезал, как только исчезла последняя ссылка на него, но это было бы фатальным для исчезновения объекта, пока ссылки на него все еще существуют. В общем случае компилятор не может знать, когда метод создает объект, будут ли какие-либо ссылки на этот объект продолжать существовать после выхода из метода. При отсутствии такой гарантии, единственный безопасный способ выделить объекты класса - это сохранить их в куче.
Между прочим, в .net одним из основных преимуществ изменяемых типов значений является то, что они могут передаваться по ссылке, не отказываясь от постоянного контроля над ними. Если класс 'foo' или его метод имеет структуру 'boz', которую один из методов foo передает по ссылке на метод 'bar', возможно, что bar или вызываемые им методы будут делать все, что захотят ' boz ', пока они не вернутся, но как только' bar 'вернет все ссылки на' boz ', они исчезнут. Это часто приводит к гораздо более безопасной и чистой семантике, чем разнородные ссылки, используемые для объектов класса.