Java adalah sebuah bahasa pemrograman dan juga sebuah platform. Sebagai sebuah bahasa pemrograman tingkat tinggi, Java adalah sebuah bahasa berorientasi objek (object oriented programming). Jika anda pernah memprogram dengan bahasa pemrograman OOP , seperti C++ atau Smalltalk , mungkin anda ingat betapa menyenangkannya memprogram dengan konteks objek. Anda merancang beberapa objek satu demi satu dengan mendefinisikan berbagai property yang dimiliki object tersebut dan pekerjaan (task) yang dapat ditangani oleh objek tersebut. Kemudian anda merangkai semua objek tersebut dengan mendefinisikan relasi antar objek tersebut seperti halnya membangun sebuah mobil dari komponen-komponennya. Belakangan ini , mungkin anda akrab dengan slogan "reusable of code". "Reuse of code" ini bukanlah cut & paste ( tapi harus diakui cut & paste memang sangat menyenangkan ). Yang dimaskud dengan "reuse of code" ini adalah suatu keadaan dimana para programmer untuk membangun sebuah objek dengan mengextend objek-objek yang telah ada secara mudah. Secara mudah disini adalah , programmer itu mungkin tidak perlu tahu dengan kode-kode dari objek yang ingin ia extend , yang ia butuhkan hanyalah pengetahuan mengenai property dari objek itu dan hal-hal yang dapat dilakukan oleh objek itu.
Kemudahan itu dapat diwujudkan dengan inheritance dan encapsulation (yang penjelasannya di luar jangkauan tulisan ini).
Selain itu Java, sebagai bahasa pemrograman, akan mempermudah tugas kita dalam merancang sebuah program yang mendukung multithreading.
Sebagai contoh sederhana adalah dalam aplikasi mail client yang anda pakai. Saat anda mendowload mail dari server, anda mungkin tidak ingin menunggu sampai semua mail berhasil didownload, baru anda dapat membacanya. Beberapa mail client memungkinkan anda untuk membaca-baca dan membrowsing mail-mail yang sudah berhasil didownload. Dan pada saat yang bersamaan , program itu tetap mendownload mail-mail yang tersisa di server. Bahkan pada saat yang itu juga anda dapat melihat animasi bumi berotasi di pojok layar anda. Semua itu, mendownload mail – membrowsing mail – dan animasi, adalah proses-proses kelas ringan (ligthweight process) dalam aplikasi mail client itu. Proses-proses itu dikenal dengan istilah thread. Ide multithreading adalah membagi-bagi waktu pemrosesan CPU dan menjadwalkannya bagi masing-masing thread itu. Jika system operasinya dapat memanfaatkan multi-processor, maka thread-thread akan didistribusikan kepada semua prosesor, dan semua proses itu akan berjalan paralel.
Satu lagi yang ditawarkan oleh Java, dan tampaknya sampai saat ini baru Java yang memiliki ini, adalah sifat portabilitas dan independensi terhadap arsitektur dari program-program yang ditulis
dengan 100% Java. Yang dimaksud dengan portabilitas dan independensi terhadap arsitektur adalah : sebuah program yang dibuat dengan Java akan dapat dijalankan pada semua mesin / komputer yang mempunyai Java Virtual Machine.
Kita mengenal 2 jenis bahasa pemrograman , interpreted dan compiled. Contoh bahasa interpreted adalah bahasa-bahasa script seperti Perl, dan JavaScript. Sedangkan contoh bahasa compiled adalah C, Pascal, C++, dll.
Pada bahasa interpreted ada sebuah interpreter yang bertindak untuk menerjemahkan baris-baris kode dari suatu program ke dalam bentuk kode-kode yang dapat dimengerti oleh komputer dimana program itu dijalankan. Proses menerjemahkan itu berlangsung pada saat program itu dijalankan. Hal yang perlu dicatat dari bahasa interpreted adalah, proses menerjemahkan itu berlangsung setiap kali program tersebut dijalankan.
Sedangkan pada bahasa compiled, kode-kode program kita terlebih dahulu diubah ke dalam bentuk kode-kode biner oleh sebuah compiler. Untuk selanjutnya, komputer dapat membaca langsung dari kode-kode biner tersebut. Berbeda dari bahasa interpreted, proses kompilasi ini hanya perlu dilakukan sekali saja. Seperti telah dibahas di atas, compiler mengubah baris-baris kode yang kita ketik ke dalam bentuk biner. Yang menjadi permasalahan adalah, sistem kode biner untuk masing-masing platform secara umum tidaklah sama. Sistem kode biner pada Macintosh tidak sama dengan sistem kode biner pada IBM Compatible PC (dengan MS.Windows-nya). Hal inilah yang membatasi portabilitas dari sebuah program yang dibuat dari bahasa-bahasa compiled seperti C, dan Pascal. Jadi bila kita hendak membuat program yang dapat berjalan di banyak platform, sebutlah PC-Windows—Macintosh—Sun Solaris—dll, kita harus melakukan kompilasi untuk masing-masing platform itu. Kalau kita ingin menawarkan aplikasi kita ke seluruh dunia, kita akan menemui kesulitan mengetahui platform apa saja yang ada di seluruh dunia. Contoh : kita ingin menawarkan aplikasi yang bisa dilihat/dijalankan lewat web, yang berarti ada kemungkinan besar aplikasi kita itu akan dijalankan oleh sembarang orang di seluruh dunia yang menggunakan platform yang berbeda-beda. Kita tidak mungkin mengetahui secara persis semua platform itu dan kita juga tidak ingin dipusingkan dengan itu.
Bagaimanapun keunggulan bahasa compiled adalah , bahasa compiled menawarkan kecepatan eksekusi yang jauh lebih tinggi dibandingkan dengan bahasa interpreted (sehubungan dengan kode-kode biner itu).
Java adalah bahasa compiled dan interpreted. Setelah kita selesai menulis kode dengan bahsa Java, kita lakukan proses kompilasi. Keluaran dari proses kompilasi itu adalah, sebuah Java Binary Code. Anda dapat memikirkan Java Binary Code sebagai ekuivalen dari kode biner yang kita bicarakan diatas. Sistem operasi / komputer / mesin itu sendiri tidak dapat mengerti Java Binary Code. Maka diperlukan sebuah Java Interpreter yang akan menerjemahkan Java Binary Code itu ke dalam bentuk kode biner yang dapat dimengerti oleh operasi / komputer / mesin yang bersangkutan. Interpreter itu dikenal dengan sebutan Java Virtual Machine.