Java jest obiektowym językiem programowania stworzonym przez grupę roboczą pod kierunkiem Jamesa Goslinga z firmy Sun Microsystems. Java jest językiem kompilowanym do postaci wykonywanej przez maszynę wirtualną i silnie typowanym. Jej podstawowe koncepcje zostały przejęte z języka Smalltalk (maszyna wirtualna, garbage collection) oraz z języka C++ (duża część składni i słów kluczowych).
Javy nie należy mylić ze skryptowym językiem JavaScript, z którym ma niewiele wspólnego (głównie składnię podstawowych instrukcji).
// oznacza komentarz // w tej postaci to obiekt reprezentujący kolorowy punkt :) public class Figura { // właściwości (atrybuty/pola) private float środekX; private float środekY; private int kolor; //tak naprawdę, do przechowywania(tworzenia) //koloru, używa się zazwyczaj obiektu java.awt.Color // operacje (metody) public float obliczPole(){ return 0f; } public float obliczObwód(){ return 0f; } public void wyświetl(){...} ... }
W Javie wszystkie obiekty są pochodną obiektu nadrzędnego (jego klasa nazywa się po prostu Object), z którego dziedziczą podstawowe zachowania i właściwości, dzięki czemu wszystkie posiadają wspólny podzbiór podstawowych możliwości takich jak ich identyfikacja, porównywanie, kopiowanie, niszczenie czy wsparcie dla programowania współbieżnego.
// "extends" oznacza dziedziczenie po klasie Figura pól: środekX, środekY i kolor // oraz metod: obliczPole, obliczObwód i wyświetl public class Kwadrat extends Figura { // dodatkowe atrybuty private float wierzchołekX; private float wierzchołekY; private float długośćBoku; // "przeładowujemy" operacje rodzica, dzięki czemu dla każdej zdefiniowanej Figury // można policzyć pole czy obwód public float obliczPole(){ return długośćBoku*długośćBoku; } ... }
Choć C++ udostępniał dziedziczenie wielobazowe, projektanci Javy odeszli od tego pomysłu. Java umożliwia dziedziczenie jednobazowe, a więc wyłącznie jedna klasa może przekazać swoje właściwości i operacje jako podstawę do rozszerzania ich o dodatkowe możliwości. Dzięki temu wyeliminowano możliwość konfliktów między właściwościami przekazywanymi przez klasy nadrzędne.
By zrekompensować spadek elastyczności wynikający z pojedynczego dziedziczenia wprowadzono interfejsy. Pozwalają one nazwać pewien określony zbiór operacji, dzięki czemu można określić, że dany obiekt, któremu przypisano dany interface (implementujący go) umożliwia wykonanie owego zestawu operacji.
Jednak z uwagi na to, że kod pośredni jest interpretowany, taki system jest wolniejszy niż kompilacja do kodu maszynowego. Z tego względu maszynę wirtualną często uzupełnia się o kompilator JIT. Istnieją również niezależne od Suna kompilatory Javy - przykładem podprojekt GCC o nazwie GCJ. W rezultacie powstaje szybszy kod, ale który można uruchamiać na jednej tylko platformie, a więc nieprzenośny.
Biblioteki Javy udostępniają wyspecjalizowane funkcje umożliwiające programowanie rozproszone - zarówno między aplikacjami Javy (RMI) jak i między aplikacją Javy a aplikacjami napisanymi w innych językach (CORBA, WebServices). Inne biblioteki udostępniają możliwość pisania aplikacji uruchamianych w przeglądarkach internetowych (aplety) oraz aplikacji działających ciągle po stronie serwera (serwlety).
O ile po pięciu odsłonach Javy jej prostota jest dyskusyjna, o tyle język faktycznie robi dużo, by utrudnić programiście popełnienie błędu. Przede wszystkim Java posiada system wyjątków czyli sytuacji, gdy kod programu natrafia na nieprzewidywane trudności, takie jak np.:
W innych językach programowania programista oczywiście może wprowadzić wewnętrzne testy sprawdzające poprawność danych, pozycję indeksu tablicy, inicjalizację zmiennych itd., ale jest to jego dobra wola i nie jest to jakoś szczególnie wspierane przez dany język. W Javie jest inaczej - obsługa wyjątków jest obowiązkowa, bez tego program się nie skompiluje. Przy tym obiekty wchodzące w skład pakietu standardowego Javy (i gros obiektów z pakietów pochodzących od poważnych programistów niezależnych) implementują wyjątki w każdym miejscu kodu, którego wykonanie jest niepewne ze względu na okoliczności zewnętrzne.
Sama obsługa wyjątków polega na napisaniu kodu, który wykona się w odpowiedzi na taką sytuację nadzwyczajną. Może to być np. podstawienie wartości domyślnej przy natrafieniu na nieprawidłową wartość parametru, zaniechanie danej akcji i powrót do stanu stabilnego czy choćby zapisanie pracy przed wyjściem. W sytuacji wyjątkowej program przerywa normalne wykonanie i tworzy specjalny obiekt wyjątku odpowiedniej klasy, który "wyrzuca" z normalnego biegu programu. Następnie zdefiniowany przez użytkownika kod "łapie" ten obiekt wyjątku i podejmuje odpowiednie działanie. Działanie może być dwojakiego typu: wspomniane wyżej środki zaradcze lub odrzucenie takiego "śmierdzącego jaja" dalej, do bloku programu, który nakazał wykonanie wadliwej operacji. Takie podawanie sobie wyjątku może być wieloetapowe i jeśli skończy się w bloku głównym programu powoduje jego przerwanie i ogłoszenie błędu krytycznego.
Oprócz systemu wyjątków Java od wersji 1.4 posiada dwa inne systemy wspomagające pisanie niezawodnych programów: logowanie i asercje. Pierwsze pozwalają na zapisanie w plikach dziennika przebiegu działania programu, z dodatkową możliwością filtrowania zawartości, określenia poziomu logowanych błędów itp. Drugie rozwiązanie pozwala na upewnienie się, że pewne założenia co do określonych wyrażeń (np. że liczba, z której wyciągamy pierwiastek jest nieujemna) są prawdziwe. Asercje są o tyle ciekawe, że działają tylko z odpowiednią opcją wykonania programu, dzięki czemu programista może sprawdzić działanie programu, a później bez wysiłku spowodować pominięcie testowej części kodu po prostu przez ominięcie tej opcji.
Dzięki takiemu systemowi nazwy klas są niepowtarzalne, co pozwala uniknąć niejednoznaczności (np. czy chodzi o klasę List implementującą strukturę listy danych czy o List implementującą graficzną listę wyświetlaną w okienku).
Wszystkie klasy pisane przez programistów niezależnych powinny być umieszczane w innych hierarchiach. Firma Sun często zaleca, by w nazewnictwie klas niestandardowych przed właściwą nazwą pakietu stosować odwróconą nazwę domeny internetowej autora pakietu. Na przykład narzędzie Ant * znajduje się w pakiecie org.apache.ant, co zapobiega konfliktom nazw z pakietami innych autorów, którzy również chcieliby nazwać swój pakiet Ant.
Domyślnie klasy pakietu nie są możliwe do użycia poza nim. Stąd nie występują konflikty nazw klas przy imporcie różnych pakietów. Klasa pakietu staje się publiczną przy deklaracji public class Foo.
Pakiety z hierarchii java i javax (dodatki wprowadzone w późniejszych wersjach) należą do podstawowego zestawu klas rozprowadzanych jako Java. Zestaw ten jest dostępny w dwóch wersjach: JRE (Java Runtime Environment) - udostępnia bytecode wszystkich klas standardowych i wirtualną maszynę do ich uruchamiania, zaś JDK (Java Development Kit) dodatkowo udostępnia źródła tych klas oraz dodatkowe narzędzia takie jak kompilator, paker czy debuger. Podział ten wprowadzono dlatego, że użytkownik Javy do uruchamiania programów potrzebuje tylko JRE, natomiast do programowania działających aplikacji potrzeba już JDK.
Swoją własną implementację JDK, certyfikowaną w ramach Java Community Process, tworzy na przykład IBM, a na bazie kodu oryginalnej implementacji powstaje przeznaczona dla Linuksa Blackdown Java.
Istnieją też projekty odtworzenia poszczególnych elementów środowiska. Wśród nich są wirtualne maszyny Javy tworzone przez społeczność FLOSS SableVM i Kaffe, doświadczalny IBM-owski kompilator Jikes, czy optymalizowany pod względem szybkości dla architektur Intela JRockit, autorstwa firmy BEA. Najczęściej wykorzystują one bibliotekę standardowych klas rozwijaną w ramach projektu GNU Classpath.
Inne podejście prezentuje projekt GCJ, który pozwala kompilować programy w Javie bezpośrednio do kodu maszynowego.
جافا | Java | Llenguatge Java | Java | Java (programmeringssprog) | Java (Programmiersprache) | Java | Java | Java programming language | Lenguaje de programación Java | Java | زبان برنامهنویسی جاوا | Java (langage) | Linguaxe Java | 자바 프로그래밍 언어 | Java (programski jezik) | Java | Java (forritunarmál) | Java (linguaggio) | Java | Java პროგრამული ენა | Java (valoda) | Java (kalba) | Java programozási nyelv | Јава (програмски јазик) | Java (programmeertaal) | Java言語 | Java (programmeringsspråk) | Java (linguagem de programação) | Java | Java | Programski jezik Java | Java | Java | Java (programspråk) | ஜாவா நிரலாக்க மொழி | ภาษาจาวา | Java (ngôn ngữ lập trình) | Java programlama dili | Мова програмування Java | Java