Cechy języka Java

 

Java to prosty język

Pierwotnie Java była oparta na językach C i C++ z pominięciem niektórych niejasnych, wprowadzających bałagan / komplikujących kod funkcji, takich jak wskaźniki (pointers), dziedziczenie z wielu implementacji (multiple implementation inheritance) - możliwość dziedziczenia z wielu klas, lub przeciążenia operatorów (operator overloading) - potencjalnie poprawiające czytelność kodu, lecz powodujące powstawanie niejasnych konstrukcji, gdzie operatory wykonują kompletnie różne czynności w zależności od użytych argumentów.

 

Java jest zorientowana obiektowo

Podejście obiektowe pozwala programiście na skoncentrowanie się na zaadoptowaniu języka programowania (Javy) do rozwiązania problemu, zamiast manipulowania problemem tak, aby dopasować go do ograniczeń wynikających z języka. To główna różnica między językiem Java a innymi językami strukturalnymi takimi, jak C. W języku obiektowym rozważamy całe obiekty razem z ich stanami oraz ich zachowaniem, a w języku strukturalnym stany i funkcje musimy rozważać osobno.

 

Java umożliwia tworzenie bardziej niezawodnego oprogramowania

Istnieje wiele cech języka Java zapewniających niezawodność, w tym mechanizm deklaracji, podwójne sprawdzanie typów podczas kompilacji i wykonywania (dla zapewnienia zgodności wersji modułów), tablice z automatyczną kontrolą przekroczenia zakresów, a także brak użycia wskaźników, kontrola pętli przy użyciu wyrażeń boolowskich zamiast wyrażeń operujących na wartościach typu całkowitego. Przykładowo, Java nie pozwala na użycie dostępnej w języku C pętli w formie while (x) x++;, ponieważ taka pętla może nie zakończyć się w oczekiwany sposób. Zamiast tego konieczne jest jawne określenie wyrażenia boolowskiego - np. while (x != 10) x++;, które zapewnia, że pętla zakończy działanie, gdy x przyjmie wartość 10.

Programy napisane w języku Java muszą być niezawodne, ponieważ są wykorzystywane w rozwiązaniach o krytycznym znaczeniu oraz działają na niezliczonej liczbie urządzeń.

 

Java to język interpretowany

Program w języku Java jest wykonywany na platformach użytkowników, takich jak Linux lub Windows, pośrednio - za pośrednictwem Wirtualnej Maszyny Javy - JVM (która jest programową reprezentacją hipotetycznej platformy sprzętowej) oraz skojarzonego z nią środowiska wykonawczego. Maszyna wirtualna w procesie interpretacji kodu tłumaczy skompilowany program Javy zapisany w formie kodu bajtowego (instrukcje i powiązane dane) na instrukcje specyficzne dla platformy sprzętowej użytkownika. Zastosowanie procesu interpretacji ułatwia debugowanie, a także ułatwia tworzenie aplikacji, ponieważ fragmenty programu Java są łączone ze sobą dopiero w chwili wykonywania.

 

Java jest językiem aplikacji sieciowych

Obszerne biblioteki Javy ułatwiają obsługę protokołów sieciowych, takich jak TCP/IT, HTTP, FTP i ułatwiają nawiązywanie połączeń sieciowych. Ponadto programy w języku Java mogą uzyskiwać dostęp do obiektów przy użyciu adresów URL (Uniform Resource Locator) tak łatwo, jak uzyskują dostęp w systemie plików.

 

Java jest językiem zapewniającym bezpieczeństwo

Ponieważ działające w środowiskach sieciowych i rozproszonych programy Java mogą być migrowane i wykonywane na różnych platformach za pośrednictwem sieci, istotnym aspektem są zabezpieczenia przed szkodliwym kodem, który mógłby rozprzestrzeniać wirusy, kraść dane, albo wykonywać inne szkodliwe działania. Jest to jeden z powodów, dla którego w Javie nie są używane wskaźniki. Ponadto Java jest wyposażona w funkcje zabezpieczeń, takie jak model zabezpieczeń Java Sandbox lub szyfrowanie kluczy publicznych.

Teoretycznie Java jest bezpieczna. W praktyce zostały już wykryte i wykorzystane słabości struktury bezpieczeństwa Javy i firma Oracle nieustannie pracuje nad kwestią zabezpieczeń i wydaje nowe aktualizacje dotyczące bezpieczeństwa.

 

Java zapewnia wysoką wydajność

Zastosowanie mechanizmu interpretacji kodu zamiast kompilacji zapewnia zawsze ponadprzeciętną wydajność. Interpreter identyfikuje kolejne instrukcje zapisane w kodzie bajtowym pobieranym z plików pośrednich .class bezpośrednio przed ich wykonaniem i wykonuje odpowiedające im instrukcje w kodzie maszynowym konkretnej platformy sprzętowej/systemowej. Gdy interpreter wykrywa, że niektóre sekwencje instrukcji w kodzie bajtowym są wykonywane częściej niż pozostałe, używany jest kompilator JIT (Just-In-Time Compiler), który kompiluje te sekwencje instrukcji na kod maszynowy. Taka kompilacja może być wykonywana w momencie pierwszego dostępu do kodu zapisanego w pilku lub pierwszego wywołania konkretnej funkcji. Zaawansowane systemy JIT potrafią wykonywać programy szybciej niż interpretery, unikając jednocześnie komplikacji związanych z pełnym cyklem kompilacji, linkowania itp.

 

Java to język obsługujący wielowątkowość (współbieżność)

Aby umożliwić zwiększenie wydajności programów, które muszą wykonywać wiele zadań w tym samym czasie, Java obsługuje techniki współbieżnego wykonywania wątków. Przykładowo program zarządzający graficznym interfejsem użytkownika (GUI - Graphical User Interface) i jednocześnie oczekujący na dane wejściowe pochodzące z sieci wykorzystuje osobny wątek do wyświetlania obrazu i osobny wątek do pobierania danych z sieci. To zapewnia responsywność interfejsu. Java udostępnia mechanizm synchronizacji fragmentów kodu, który pozwala zagwarantować spójność wykonania wybranego ciągu instrukcji, a wątkom umożliwia bezpieczne współużytkowanie danych bez ich uszkadzania.

 

Java jest niezależna od platformy (neutralnym pod względem architektury docelowego systemu)

Sieci łączą platformy o odmiennych architekturach, z różnymi procesorami i różnymi systemami operacyjnymi. Nie możemy oczekiwać, że Java wygeneruje kody maszynowe, które będą zrozumiałe dla każdego urządzenia podłączonego do sieci. Zamiast tego Java generuje niezależne od platformy instrukcje w formie kodu bajtowego (pośredniego), które mogą zostać łatwo zinterpretowane do formy kodu maszynowego za pomocą wirtualnej maszyny Javy (Java Virtual Machine - JVM) zaimplementowanej na konkretnej platformie.

 

Java jest językiem przenośnym

Niezależność od platformy sprzętowej i systemowej przekłada się bezpośrednio na przenośność kodu. Jednakże oprócz niezależnych od platformy instrukcji w formie kodu bajtowego, biblioteki Javy udostępniają typy danych, które łączą kod Javy ze specyficznymi dla danej platformy możliwościami, zapewniając najwyższy możliwy stopień przenośności. Przykładowo 32-bitowy typ integer jest zawsze zapisywany na 32 bitach i jest wartością ze znakiem bez względu na to, czy docelowa platforma korzysta z rejestrów 16-, 32-, czy 64-bitowych.

 

Java jest językiem dynamicznym.

Ponieważ wzajemne połączenia między kodem programu a bibliotekami są tworzone dynamicznie w czasie wykonywania programu, nie ma potrzeby jawnego łączenia programu i bibliotek. W efekcie, gdy nastąpi aktualizacja dowolnej biblioteki lub programu (np. z powodu wprowadzenia poprawki usuwającej błąd lub zwiększającej wydajność), twórca oprogramowania musi dokonać dystrybucji wyłącznie zmodyfikowanych bibliotek lub elementów programu. Jednakże taka dynamiczna właściwość oprogramowania Java i związane z nią zasady dystrybucji fragmentów kodu przy wydawaniu nowych wersji mogą prowadzić do konfliktów wersji. Może to nastąpić, gdy np. z biblioteki zostanie usunięta określona klasa lub nastąpi zmiana jej nazwy. Wówczas przestaną działać istniejące wersje oprogramowania, które z danej klasy korzystają. Aby temu zapobiec, w języku Java dostępny jest mechanizm Interface.