Ce n'est pas une exigence de la POO. Il est juste plus efficace de stocker une référence à certains types plutôt que le contenu lui-même. Il peut être très fastidieux de faire circuler des objets complexes, mais très efficace pour simplement passer une référence ou une adresse de l'objet. La plupart des langages de programmation supportent à la fois (les types de valeur et de référence) de ces concepts (les créateurs de Java choisissent de tout hériter d'un objet).
De nombreuses plates-formes, telles que .NET, fournissent des structures qui ressemblent un peu à des objets légers. Ils ne supportent pas l'héritage, mais peuvent avoir des structures assez complexes avec beaucoup de membres. Même si les structures supportent des types de données complexes, ce sont des types de valeurs. Bien sûr, si une structure est trop complexe, elle devient inefficace et il vaut mieux en faire une classe.
Les variables en C++ * peuvent * contenir des objets entiers. Les variables dans Java ne peuvent pas. Les variables en C# ne peuvent contenir des objets que si leur classe hérite de 'System.ValueType'. – cdhowie