جاوا یا Java زبانی است شی گرا و توسط فردی به نام جیمز گاسلینگ در سال 1995 به عنوان بخشی از سکوی جاوا منتشر شد.
قبل از هر توضیح دیگری باید بدانیم شی گرایی چیست و دیدگاه شی گرایی برای توسعه نرم افزار چیست.
شی گرایی انقلابی در توسعه نرم افزار ایجاد کرد در حالی که جاوا بر پایه شی گرایی ایجاد شده و این موضوع بیان گر آن است که شی گرایی سابقه ایی طولانی تر از جاوا دارد.
هدف شی گرایی طراحی اشیای دنیای واقعی با استفاده از کلاس است.برای مثال برنامه ای مینویسیم تا بر روی چوبی به اندازه 2 متر با فاصله 10cm میخ بکوبد. با در نظر گرفتن اصول شی گرایی در این برنامه می توان  میخ ٰ- چوب – چکش را یک شی در نظر گرفت.با این دیدگاه هر کدام از این اشیا را به کلاس تبدیل می کنیم (مدل سازی می کنیم).
ابتدا از کلاس چوب و چکش نمونه ایی ایجاد می کنیم. سپس از کلاس میخ نمونه ای ایجاد می کنیم و با استفاده از نمونه های ایجاد شده ی قبلی از چکش و چوب میخ ها را به فاصله 10cm از یکدیگر می کوبیم.
مزیت بزرگ شی گرایی Object-oriented programming یا به اختصار OOP این است که برنامه با سازماندهی بالا تر طراحی می شود و در مقابل تغییرات انعطاف پذیر است.همچنین میزان کد تولیدی برنامه را به طرز چشم گیری کاهش می دهد و خوانایی برنامه را بالا می برد.از از کلاس های ایجاد شده می توان در برنامه های دیگر با ایجاد تغییر یا بدون ایجاد تغییر استفاده کرد.
شی گرایی در جاوا به 3 طریق است :
Encapsulation یا اصل نهان سازی
Inheritance یا ارث بری
 Polymorphism‌ یا چند ریختی
باید در نظر داشت که زبان جاوا بسیاری از گرامر (syntax) خود را از زبان c و c++‌ گرفته و در مواردی بعضی از امکانات موجود در این زبان ها را به کار نبرده است.
مثلا در شی گرایی C++‌ از وراثت چندگانه پشتیبانی می کنند یعنی یک کلاس C++ میتواند از چندین کلاس دیگر ارث بری کند و خواص آنها را در خود اضافه کند
(که این امر اگر با بی دقتی انجام شود ممکن است اشکالاتی را به وجود بیارد)
که در جاوا وراثت چندگانه یا multi inheritance پشتیبانی نمیشود و یک کلاس در جاوا تنها می تواند از یک کلاس ارث بری کند اما به جای وراثت چندگانه جاوا واسط ها را معرفی کرد که هر کلاس میتواند از یک کلاس ارث بری و چند واسط (interface) را پیاده سازی کند.
در C و C++ اشاره گرها وجود دارند که در جاوا به کار نبرده است که همانند وراثت چندگانه با بی دقتی باعث بروز مشکل میشود.پس تا اینجا هدف جاوا را می توان ساده سازی و بالا بردن امنیت برنامه دانست زیرا با استفاده از اشاره گر ها (pointer) و وراثت چندگانه پیچیدگی برنامه بالا می رود.البته تمام هدف جاوا همین نبوده و کار های دیگری هم صورت گرفته است.
اهداف جاوا
1-این زبان باید ساده، شی‌گرا و مشهور باشد.
2-مطمئن و بدون خطا باشد.
3-وابسته به معماری کامپیوتر نبوده و قابل انتقال باشد.
4-باید با کارایی بالا اجرا شود.
5-باید به صورت پویا و نخ‌کشی‌شده باشد.
کدهای جاوا پس از کامپایل به کد میانی (بایت کد یا byte code)  که قابل فهم برای cpu نیستند تبدیل می شوند.و بدون در نظر گرفتن نوع سخت افزار و سیستم عامل اگر ماشین مجازی جاوا Java Virtual machine‌ یا JVM در آن کامپیوتر نصب باشد بایت کد جاوا را (یک فایل با پسوند .class)  میتواند ترجمه کند به زبان ماشین تا اجرا شود.
پس جاوا یک زبان قابل حمل می باشد (portable است).
اما در زبانی مانند C++ که دارای شی گرایی می باشد اوضاع این چنین نیست.فایل سی پلاس پلای به یک فایل .obj کامپایل شده و به یک فایل .exe‌ لینک داده میشود.این فایل فقط در همان کامپیوتر قابل اجرا میشود و برای اجرا در کامپیوتری دیگری باید در آن کامپایل شود.
جاوا اداره خودکار حافظه دارد در حالی که در C++ برنامه نویس باید خودش حافظه را کنترل کند که در صورت اشتباه باز هم برنامه با مشکلاتی ایجاد می شود.
(پیچیدگی در C++‌به مراتب بالا تر از جاوا است)
جاوا بر پایه شی گرایی است و دارای ساختار نیست در حالی که C++ ترکیبی از این دو می باشد.
این یک مزیت برای جاوا در مقابل C++ است اما جاوا برای این کار کمی سرعتش را قربانی کرده است.
**یک برنامه جاوا به صورت بایت کد می‌باشد و باید در ماشین مجازی جاوا اجرا گردد. به همین دلیل سرعت اجرای پایینی را در مقابل زبان‌هایی همچون ++C دارد. به صورت دیگر یک برنامه C به طور متوسط تا ۱۰ برابر سریعتر از برنامه مشابه جاوا اجرا می‌گردد.جاوا علی‌رغم شیءگرا بودن در بخشی از قسمت‌ها برخی از اصول شی‌گرایی را نادیده گرفته‌است از جمله این قسمت‌ها قابلیت ب ازتابش Reflection می‌باشد.
سرعت پایین برنامه‌های جاوا در محیطی که اجرا می‌شوند ملاک کارایی نبوده زیرا در محیط وب مسئله‌ای که سرعت را کند می‌سازد، شبکه بوده و ابتدا باید سربار شبکه را از روی برنامه‌ها برداشت. از طرف دیگر در برنامه‌های رومیزی هم در JDK 5.0 و ۶٫۰، بهینه‌سازی بسیاری بوجود آمده که این مسئله باعث شده که در آخرین تست کارایی که انجام شده یک برنامه جاوا در محدودهٔ ۰٫۸ تا ۱٫۳ همان برنامه در ++C کارایی داشته باشد که ۱٫۳ آن مربوط به بخش واسط کاربری و سرعت ۰٫۸ آن مربوط به بسته تخلیه حافظه می‌شده که هیج الگوریتمی نتوانست از الگوریتم Garbage Collector جاوا پیشی بگیرد. همچنین سال ۱۹۹۹ در مقاله‌ای آقای Lutz Prechelt به این مسئله را ثابت کردند که تجربه برنامه‌نویسی که برنامه‌ای را می‌نویسد از انتخاب زبانی که برنامه برروی آن نوشته می‌شود در کارایی تأثیر بیشتری دارد و این بدان معناست که کارایی یک برنامه را برنامه‌نویس مشخص می‌کند و نه زبان برنامه‌نویسی (ایشان در همان مقاله از زبان جاوا استفاده نمودند تا ذهنیت بد را از بین ببرند.
همچنین در صنعت نرم‌افزار هزینه اصلی مربوط به ساخت نرم‌افزار است و نه تهیه سخت‌افزار برای دستیابی به سرعت بیشتر.
نسخه‌های جاوا به همراه تاریخ انتشار آنها:
JDK 1.0، انتشار در ۲۱ ژانویهٔ ۱۹۹۶
JDK 1.1، انتشار در ۱۹ فوریهٔ ۱۹۹۷
J2SE 1.2، انتشار در ۸ دسامبر ۱۹۹۸
J2SE 1.3، انتشار در ۸ می ۲۰۰۰
J2SE 1.4، انتشار در ۶ فوریهٔ ۲۰۰۲
J2SE 5.0، انتشار در ۳۰ سپتامبر ۲۰۰۴
Java SE 6، انتشار در ۱۱ دسامبر ۲۰۰۶
Java SE 7، انتشار در ۲۱۲۸ ژوئیه ۲۰۱۱
Java SE 8، انتشار در ۱۸ مارچ ۲۰۱۴
شرکت سان میکروسیستم، ۴ نوع ویرایش از کاربردهای مختلف جاوا را ارائه داده‌است :
Java card for smartcard
Java ME (Micro Edition)
Java SE (Standard Edition)
Java EE (Enterprise Edition)