Основни характеристики на JAVA
Java е платформено независим език
Компилаторът (javac) преобразува изходния код (.java файл) в bytecode (.class файл). JVM изпълнява байткода, генериран от компилатора. Този байткод може да работи на всяка платформа като Windows, Linux, Mac OS и т.н. Това означава, че програма, написана на Windows, може да се изпълнява под Linux и обратно. Всяка операционна система има различна JVM, но изходният резултат от изпълнението на bytecode е идентичен при всички тях.
Java е обектно-ориентиран език
Обектно-ориентираното програмиране е метод за организиране на софтуера чрез обекти, всеки от които е екземпляр на определен клас.
В Java са реализирани основните принципи на обектно-ориентираното програмиране:
- Абстракция
- Капсулиране
- Наследяване
- Полиморфизъм
Java не включва сложни функции като предефиниране (overloading) на оператори, множествено наследяване, указатели и изрично управление на паметта. Това прави Java лесен за усвояване език.
Езикът е проектиран с акцент върху ранното откриване на потенциални грешки, поради което компилаторът на Java може да идентифицира проблеми, които трудно се забелязват в други езици за програмиране. Ключовите характеристики, които правят Java надежден език, са автоматизираното управление на паметта и механизмите за обработка на грешки.
Чрез езика Java могат да се разработват разпределени приложения. Програмите на Java могат да функционират в мрежа от системи, свързани чрез интернет. Обектите в една JVM могат да изпълняват процедури в отдалечена JVM.
Java поддържа многонишковост, което позволява едновременното изпълнение на две или повече части на програмата с цел максимално оползотворяване на процесорните ресурси.
Oбщи термини в Java
Преди да се пристъпи към изучаването на Java, е необходимо да бъдат изяснени понятието Java bytecode и разликите между JVM, JRE и JDK.
Java bytecode
Java bytecode е набор от инструкции за виртуалната машина на Java. Той представлява междинен код, генериран от компилатора след обработка на изходния код (Java програма). При изпълнение на програма:
- Компилаторът преобразува изходния Java код в bytecode (код във формат .class файл) и
- Интерпретаторът изпълнява този bytecode в системата. Интерпретаторът се нарича още JVM (Java Virtual Machine).
Bytecode е свързващото звено между компилатора (който го създава) и интерпретатора (който го изпълнява). Чрез него се постига платформена независимост, тъй като bytecode може да се изпълнява на всяка платформа с инсталирана Java среда.
Java Virtual Machine (JVM)
JVM е абстрактна машина. Тя се нарича „виртуална“, тъй като не съществува като физическо устройство. Представлява спецификация, осигуряваща работна среда за изпълнение на Java байткод. При всяко стартиране на Java клас чрез командния ред се създава нова инстанция на JVM.
JVM изпълнява следните основни задачи:
- Зарежда кода
- Потвърждава кода
- Изпълнява кода
- Осигурява среда за изпълнение
За всяка операционна система съществуват различни реализации на JVM, но резултатът от изпълнението на bytecode е идентичен за всички тях. Това е основната причина Java да се дефинира като платформено независим език.
Java Runtime Environment (JRE)
JRE е пакет от софтуерни инструменти за изпълнение на Java приложения. Тя осигурява необходимата среда, като имплементира спецификацията на JVM. За разлика от JVM, JRE съществува физически и включва набор от библиотеки и помощни файлове, използвани по време на работа.

JRE е съставна часть от JDK, но може да бъде инсталирана и самостоятелно. Ако разполагате с инсталирана JRE, можете да стартирате Java програми, но няма да можете да ги компилирате. JRE е напълно достатъчна в случаите, когато е необходимо единствено стартиране на готово приложение.
Java Development Kit (JDK)
JDK е цялостен пакет за разработка, който включва в себе си JRE (среда за изпълнение), компилатори (javac) и разнообразни инструменти като JavaDoc, дебъгер и други. За пълния цикъл на създаване, компилиране и тестване на Java приложения е задължително наличието на инсталиран JDK.

Javac е основният Java компилатор, включен в JDK. Той обработва изходния код на програмата и генерира Java bytecode като краен резултат.