یکی از بزرگترین مشکلات یک برنامه نویس در زبانهای OO چگونگی اداره اشیا میباشد. از یک نقطه نظر هر نوع داده باید یک شی باشد و هر نوعی باید از یک شی اصلی و پایه به وجود آمده باشد. این باعث میشود تمام انواع داده شبیه به هم عمل نموده که با به اشتراک گذاری یک سری از خصیصه ها انجام میشود (Methods and Properties).
به خاطر اینکه انواع ساده اغلب برای کنترل حلقه های تکرار و دستورات شرطی میباشد تبدیل این انواع به اشیا باعث ایجاد اثرات منفی میگردد. با توجه به این مساله پیدا کردن تعادل درست در اینکه هر چیزی یک شی است و همچنین کارایی های آن چیز مهم است. در Java این مشکل حل شده است، اول ۸ نوع ساده را تعریف میکند: boolean, double, float, char, long, int, short, byte . این انواع به طور مستقیم به مقادیر باینری ترجمه (Compile) میشوند بنابراین یک متغیر از نوع int میتواند به طور مستقیم توسط CPU مورد استفاده قرار گیرد بدون اینکه هیچ بار اضافی به وجود آورد. انواع ساده در Java از لحاظ سرعت مانند زبانهای دیگر میباشد بنابراین یک حلقه که به وسیله نوع int کنترل میشود با نهایت سرعت اجرا میگردد.
برخلاف انواع ساده دیگر انواع در Java به شکل اشیا بوده که از کلاس پایه Object مشتق میشوند. و دارای یک سری متدها برای استفاده میباشد مثلا تمام انواع دارای یک متد toString() میباشند. در Java تمام انواع توسط یک ارجاع (Reference) قابل دستیابی میباشد و به همین خاطرGarbage Collection به طور موثر قابل پیاده سازی است. زمایکه هیچ اشاره ای به شی وجود ندارد آن شی بازیابی میشود.
اگر چه انواع ساده کاملا موثر بوده اما زمانهایی وجود دارد که به امکانات اشیا نیازمندیم. برای مثال شما ممکن است بخواهید لیستی از انواع Integer را در زمان اجرا ایجاد نموده و بعد از اتمام کار منابع آنهارا به سیستم بازگردانید، برای این منظور Java نوع Integer را تعریف میکند.