Nurtuje Was pytanie czy warto uczyć się Javy w 2021 roku? Faktem jest, że ja korzystam z tego języka dopiero od drugiego roku studiów niemniej jednak jestem w stanie stwierdzić czy moim zdaniem jest sens zawracać sobie nim głowę. Tym bardziej, że mam zamiar jeszcze pisać w nim programy w przyszłości (może też kiedyś gry?). Sprawdźcie już teraz moją opinię na ten temat oczywiście "postawioną" na argumentacji. Nie tylko za, ale również przeciw.

Tak oto dochodzimy do ostatniego artykułu z długiego cyklu na temat języka Java. W przyszłości mogą pojawić się jeszcze jakieś, ale będą to pojedyncze wpisy. Na dzisiaj mam dla Was coś specjalnego na odejście od tematu. Czy zdajecie sobie sprawę, że mogliście wielokrotnie źle korzystać z łańcucha znaków od czasu utworzenia instancji? Dowiedzieliśmy się już znacznie wcześniej, że łańcuch znaków w języku Java sprawia trudności w języku C, aczkolwiek w Javie też jest pewna pułapka i to o wiele bardziej perfidna, bo niedająca po sobie niczego poznać. Zapraszam serdecznie, to jest bardzo ważny wątek!

Kontynuujemy wątek dotyczący pakietów, aby traktować go jako drugi krok do tego, jak należy PRAWIDŁOWO ręcznie kompilować kod źródłowy w języku Java. Proszę o cofnięcie się wstecz jeśli nie przerobiliście tamtego etapu, jest on kluczowy, żeby zrozumieć, a także utworzyć własny archiwum JAR w języku Java. Zapraszam.

Poruszymy dzisiaj wszystkie trzy kolekcje w języku Java (a raczej ich rodzaje): "List", "Set" i "Map". Dosyć sporo się już napisało o niektórych konkretnych kolekcjach więc warto teraz skonfrontować te trzy typy, pokazać ich najlepsze zastosowania oraz zalety i wady. Zapraszam bardzo serdecznie!

Przechodzimy do części praktycznej "równości" obiektów w Javie. Trzymamy się kolekcji "HashSet" i rzucam następującymi hasłami: "hashCode" w języku Java (zwany "kodem mieszającym") i "equals". Jesteście zaciekawieni znaczeń tych słów kluczowych i w jaki sposób mogą pomóc nam przy ustalaniu czy dwa obiekty są sobie równe? Nie pozostaje Wam nic innego jak wchodzić do środka artykułu!

Następna porcja wiedzy na temat kolekcji w Javie. Wcześniej poruszyłem temat kolekcji "TreeSet", a teraz dowiemy się co nieco o bardzo podobnej kolekcji zwanej "HashSet" w języku Java. Przy okazji będzie wstęp do rozumienia "równości" obiektów. Zapraszam po szczegóły.

Jesteście zainteresowani jakie inne kolekcje występują w Javie? OK, zdecydowana większość problemów może zostać rozwiązana za pomocą "ArrayList", natomiast są też takie, które okażą się o wiele skuteczniejsze albo chociaż zaoszczędzą trochę pisania ze względu na ich niektóre działania wykonywane automatycznie. A skoro o automatycznych działania mowa, to obejrzymy sobie kolekcję "TreeSet" w języku Java i porównamy sobie z poprzednim "książkowym" przykładem.

Zakończyłem jak na razie temat typów generycznych w Javie. Te trzy części tłumaczenia zastosowania typów ogólnych były potrzebne po to, abyśmy mogli teraz spokojnie wrócić do poprzedniego rozdziału na którym stanęliśmy. Możemy w końcu porównać sobie interfejs "Comparable" w języku Java do poprzedniego i zobaczyć jak daleko idą te różnice.

Javy nie ma końca. Kontynuujemy temat typów ogólnych. Poprzednio wspomniałem o słowie kluczowym "extends" w języku Java, które nie tylko jest wykorzystywane podczas dziedziczenia przez klasy, ale także przez typy generyczne. Poznajcie tajemnicę drugiego znaczenia "rozszerzania", bo przy programowaniu uogólnionym ma to dwojakie zastosowanie.

Przejdziemy teraz do drugiej części trudnego do przyswojenia tematu jakim są typy generyczne. Java posiada szerokie pole do popisu jeśli chodzi o programowanie uogólnione, bo tak to się elegancko nazywa. Kolejnym krokiem w ich prawidłowym rozumieniu są metody generyczne w języku Java. Jak je tworzyć, jak je rozumieć a co najważniejsze, jakie dają korzyści. Wszyscy zainteresowani niech zaglądają do środka!

Wczoraj poruszyłem kwestią związaną z sortowaniem kolekcji. Nie możemy iść dalej z kontynuacją tego tematu bez podstawowego rozumienia typów generycznych. Typy generyczne w języku Java stanowią kręgosłup wszystkich wykorzystywanych kolekcji i to nie tylko w tym języku. Zrobię teraz do tego wstęp na taki sam kształt jak wtedy z wątkami.

Czy już wiecie jak możemy posortować dowolną kolekcję w języku Java, która przyjmuje obiekty typu klasowego? Mamy dwie drogi: interfejs "Comparator" lub "Comparable". Dzięki nim, jesteśmy w stanie ustalić kryterium w jaki sposób mają być sortowane obiekty o którym pisałem w pierwszej części. Przyjrzymy się najpierw interfejsowi "Comparator" w języku Java.

Póki co, postanowiłem uznać serię artykułów na temat wątków w Java za zakończoną. Gdyby trzeba było coś jeszcze dodać, to z pewnością później wprowadzę. Rzućmy teraz okiem na kolekcje. Co byście powiedzieli gdyby konieczne było sortowanie kolekcji w języku Java? Jest możliwość posortowania najbardziej powszechnie stosowanej kolekcji bez stosowania żadnych skomplikowanych sztuczek (jak się później okaże, zależy jakiego typu są argumenty). Zapraszam do środka artykułu.

Dobra. Dotychczas temat wątków opierał się o same podstawowe zagadnienia. Uprzedzam, że od tej pory będziemy wchodzić w szczegóły, które mogą spowodować zrobienie sobie dłuższego "przystanku". Jak dobrze pamiętają ci, którzy czytali samą teorię, wątek w języku Java musi być opatrzony serią niezbędnych zabezpieczeń celem eliminacji wszelkich kolizji. Tematem na dziś będzie spójność danych, czyli jak sprawić, żeby przy pomocy słowa kluczowego "synchronized" w języku Java, modyfikacja pewnej danej przez jeden wątek obowiązywała w innych obecnie działających wątkach. Język dysponuje pewnymi sposobami wdrażania takiego zabezpieczenia.

Programując wątki w języku Java, każdy z Was bez wyjątku musi pojąć jedną bardzo ważną rzecz dotyczącą samego ich usypiania. OK, wiemy już, że za pomocą statycznej metody "sleep" klasy "Thread", możemy oddziaływać na przebieg działania wątku po prostu go opóźniając o podaną liczbę milisekund. Natomiast jest jeden niuans domagający się wyjaśnień. Uśpienie wątku w języku Java też coś przed nami ukrywa. Serdecznie zapraszam do środka artykułu.

Lecimy dalej naprzód z wątkami w Javie! Dzisiaj skonfrontujemy oba sposoby tworzenia wątków. Jest możliwość zrobienia tego od strony dziedziczenia klasy "Thread", ale mamy również do dyspozycji implementację interfejsu "Runnable" w języku Java. Którą drogę wybrać? Czy są jakieś różnice w działaniu? A może w efektywności? Przekonajcie się już teraz. Wątek może zostać utworzony na dwa sposoby.

Oto przed Wami część druga rozdziału poświęconego wątkom w języku Java. Wczoraj opisałem dosyć rozlegle jak to wygląda teoretycznie. Programowanie współbieżne przeznaczone jest tylko dla nieco bardziej "kumatych" w tej dziedzinie i z pewnością amatorzy się w tym nie odnajdą. Dzisiaj uzupełnimy sobie tę wiedzę o drugą "połowę", czyli praktykę. Utworzymy sobie własny pierwszy nowy "Thread" w języku w Java!

Zmęczeni już tą biblioteką "Swing"? Spokojnie, zmieniamy temat na całkiem inny i przejdziemy teraz do zagadnień związanych z połączeniem sieciowym. Java pozwala na łatwe tworzenie połączenia sieciowego na podstawie architektury klient-serwer. Przedstawiam Wam klasę "Socket" w języku Java - to od niej zaczyna się cała historia!

Przejdziemy teraz do zupełnie innego tematu dotyczącego Javy i zaprezentuję Wam jak utworzyć podstawowy warsztat dla odtworzenia pojedynczej nuty granej za pomocą interfejsu MIDI. Aby "MIDI" w języku Java dawało oczekiwane rezultaty, wymaga poznania i zrozumienia kilku następnych klas które wspólnie przygotujemy i napiszemy. Zapraszam!

Czy wiecie jakie Java posiada możliwości obsługi dat i kalendarzy? Są takie dwie klasy, które można w miarę szybko opanować. Jedną z nich jest "Date" w języku Java. Daty w Javie mogą podlegać operacjom arytmetycznym w stylu "odejmij 80 dni od bieżącej daty" otrzymując w ten sposób całkowicie poprawną kalkulację z uwzględnieniem dni przestępnych oraz regionu w jakim się aktualnie znajdujemy. Interesuje Was dalszy ciąg?

Poznamy teraz kolejny zapis dający wygodę przy wywoływaniu konkretnej funkcji danego obiektu dla każdej instancji przebywającej w kolekcji. Gdzie tam zwykła pętla "for" czy nawet pętla rozszerzona. Nawet wyrażenie lambda ukazane całkiem niedawno można jeszcze bardziej skrócić. Niech Wam posłuży referencja do metody w języku Java!

Zerkniemy znowu na obsługę wyjątków. To nie będzie kolejna pogadanka o wyjątkach, a tylko o pewnej metodzie wykorzystywanej nałogowo przez wiele osób w programach, filmach czy poradnikach. Widzicie to tyle razy. Za każdym razem gdy ktoś na szybko pisze "try-catch", zwykle osadza to samo wyrażenie po nazwie instancji klasy "Exception". Bez przerwy w przeważającej większości przypadków ludzie zalecą Wam to samo. W książkach wielkimi wołami również jest o tym wspomnienie, a jednak można nie zdawać sobie sprawy co ta metoda robi takiego ekscytującego, że wszyscy to stosują. "printStackTrace" w języku Java. Co to takiego? Zapraszam do środka.

Wznawiam temat serializacji danych w języku Java (radzę zobaczyć poprzednią część jeśli nie wiecie o czym mowa). Wyobraźmy sobie taką sytuację. Mamy naszą klasę, implementujemy interfejs "Serializable" i każemy programowi zapisać wszystkie dane składowe...oprócz jednej! Takiej małej zmiennej, która powinna być pomijana ze względu na wartość unikalną dla konkretnego uruchomienia aplikacji. O Boże! Czy to znaczy, że z powodu takiej błahostki, serializacja obiektów idzie w drzazgi i trzeba od razu przerzucać cały system przechowywania do pliku tekstowego? Niekoniecznie! Twórcy języka i o takiej sytuacji pomyśleli więc mogę ją teraz zaprezentować. Poznajcie kolejne słowo kluczowe związane z wykluczaniem danych składowych do zapisu, "transient" w języku Java!

Przystępujemy do następnego artykułu po zapowiedzianej dłuższej przerwie. Przyznajcie szczerze, niezbyt piękny był ten zapis z klasami, prawda? Tak trzeba było pisać zanim pojawiła się Java 8. OK, teraz przystąpimy do bardziej nowoczesnego sformułowania. Ono istnieje już od sześciu lat więc o nim też mogliście już nieraz usłyszeć. Przedstawiam Państwu wyrażenie lambda w języku Java (ang. "lambda expression")!

Nie możemy dalej iść z biblioteką "Swing" dopóki nie zapoznamy się ze sposobami "podpinania" zdarzeń. Istnieją dwie metody: starsza istniejąca od Javy 5.0 (2004) i nowsza od Javy 8 (2014). Pokażę Wam obie i podzielę to na dwie części. Najpierw struktura sama w sobie, a potem jak ją wykorzystać i "podstawić" do przycisku, aby coś się wydarzyło po jego naciśnięciu. Oto pierwsza metoda: klasa wewnętrzna w języku Java. Szczegóły w środku!

4 maja, zaczynamy kolejną serię! Będę miał przyjemność pisać Wam na temat biblioteki "Swing" w języku Java, która pozwala na tworzenie graficznych interfejsów użytkownika. Nie będzie o "JavaFX"! Wiem o jej istnieniu, ale mam swoje powody, aby o niej teraz nie pisać. Jak utworzyć pierwsze okno i dlaczego w Swing zapraszam do artykułu.

Ostatnia wypowiedź na dzisiaj (dotycząca Javy oczywiście) sięgać będzie tematu formatowania danych w postaci łańcuchów znaków, czyli typu "String". Nie chodzi tylko o konwertowanie liczb na łańcuchy, ale także ich ładne prezentowanie. Na przykład wypisanie dużej liczby z odstępami, czy też wyświetlenie wyników danej kolumny z tabelki o tej samej szerokości pola, aby kolejne dane się "nie rozjeżdżały". Prezentowana tutaj metoda która nam to umożliwi to formatowanie danych w języku Java. Zapraszam już po raz ostatni w dniu Konstytucji 3 Maja!

Zabieram się za kolejną porcję obfitego redagowania na własnej stronie. Znowu Java bez zmian i opowiem czym jest import statyczny w języku Java oraz czym się on różni od zwykłego. To również stanowi jedynie element poboczny i może pomóc lub zaszkodzić w zależności od tego, kto czyta nasz kod. Nie migajcie się, poznajcie kolejny element o którym się mało mówi.

Jest jeszcze wczesna godzina, zatem macie moją wypowiedź już po raz czwarty z rzędu TEGO SAMEGO DNIA! Nie wiem jak ja to znoszę i póki co, nie chcę się nad tym zastanawiać. Przechodzimy do kolejnego prostego tematu związanego z Javą, który macie traktować jako całkowicie opcjonalny. Dotyczy on statyczności, jest rzadko stosowany, a to coś w języku Java kryje się pod nazwą "inicjalizator statyczny". Poznajcie szerzej ten termin razem z przykładem pozostawionym w środku.

Gotowi na dalsze wyjaśnienia związane z tym samym artykułem? Został jeszcze jeden element. Pamiętacie dopisek "throws" w nagłówku funkcji? Jest to nieco rzadziej omawiany element a szkoda, bo równie przydatny co samo przechwytywanie wyjątków. Obsługa wyjątków to jedno, a "przerzucenie" tej odpowiedzialności na metodę wywołującą za pomocą słowa kluczowego "throws" w języku Java to zupełnie inna bajeczka.

Godzina dwunasta, zatem piszę po raz drugi. Wracając do tamtego artykułu trzeba opisać kolejny obcy termin na który wtedy zwróciłem Waszą uwagę. Serializacja obiektów w Javie wiąże się z dużą odpowiedzialnością. To nie jest temat, który powinien być w rękach kompletnej amatorszczyzny. Po czym rozpoznać doświadczonego od początkującego w tym temacie? Jeden wstawi ważną stałą "serialVersionUID" do klasy, a drugi nie. Wyjaśnienia czym jest "serialVersionUID" w języku Java w środku.

Na pierwszy strzał idzie wyjaśnienie jednej z kilku nieścisłości, które pojawiły się w tym artykule. Pakiety tworzone za pomocą słowa "package" w języku Java są szeroko wykorzystywane tylko nie każdy wie z jakich powodów. Może Wy jesteście zainteresowani dlaczego stosujemy pakiety i jakie są zasady ich wykorzystywania?

UWAGA!!!

Ze względu na stwarzanie problemów przez Joomlę z powodu korzystania z samego słowa "Java" pisanego z małej litery, będę przez całość artykułu posługiwał się tą nazwą pisaną wielką literą. Przepraszam za utrudnienia jednak to prawdopodobnie wynika z kolizji nazw i Joomla musi jakoś korzystać z tego słowa podczas przetwarzania treści artykułu.

Trzeci raz z rzędu piszę do Was tego samego dnia. Odejdźmy teraz od złożonych rzeczy i skupmy się na czymś prostszym. Jest jeszcze tyle tematów w języku Java, a nie zostały one omówione. Taka pętla "foreach" w języku Java na przykład. Nazywana jest również pętlą rozszerzoną. Debiut miał miejsce właśnie w Javie i pozwala na wygodniejszy sposób obsługi wszelkich tablic i list, czyli zmiennych przechowujących wiele danych. To będzie ostatni wpis na dzisiaj.

Zaprezentuję teraz drugi wariant zapisu i odczytu danych. Język Java oferuje dodatkowo obiekty zdolne do przetwarzania danych zapisanych w pliku tekstowym. Tutaj procedura jest zdecydowanie bardziej rozbudowana i uprzedzam, że może sprawiać duże trudności w rozumieniu, gdyż kod przeze mnie prezentowany będzie od razu zaopatrzony w funkcje których mogliście nie widzieć jeszcze na własne oczy. Skoro już Państwa uprzedziłem, przechodzimy do rozpoczęcia tematu. Zapis i odczyt z pliku tekstowego.

Nie opuszczamy Javy ani na moment, zmienimy jedynie temat. Na początek mam jedno pytanko. Czy ktoś z Was wie do czego służy serializacja obiektów w języku Java? Wiecie w ogóle że jest taki termin? Jeśli drapiecie się po głowie, to czytajcie uważnie. Nie mówię, że jest to podstawa w rozumieniu języka, natomiast przechowywanie danych w celu zapisu i odczytu może być ciekawym eksperymentem. To co, przekonałem do zmiany decyzji?

Niniejszy artykuł będzie robił za podsumowanie tego "sznurka" poprzednich wpisów na temat samego dziedziczenia w języku Java. Być może przypomni mi się coś jeszcze istotnego a na razie, wypuszczam ostatnią planowaną część na temat dziedziczenia w której polimorfizm wkracza do akcji. Polimorfizm w języku Java to dwa fundamenty programowania obiektowego stojące obok hermetyzacji. Zakończmy wreszcie to, co zaczęliśmy już dawno temu!

Jesteście gotowi na następną część z tematu dziedziczenia? Podnosimy poprzeczkę i zaprezentuję Wam kolejne słowo kluczowe umożliwiające łączenie przesłaniania metody z wywoływaniem jej "wersji pierwotnej". Jest nim "super" w języku Java. Dziedziczenie to jeden z szerszych tematów który co gorsza, jest elementarną podstawą do umiejętnego wykorzystywania paradygmatu obiektowego.

Przystępujemy do następnej części z cyklu "Dziedziczenie w języku Java". Jak wiemy z poprzedniej części, klasa abstrakcyjna pozwala nałożyć zabezpieczenie na tworzenie zbyt ogólnych obiektów. Teraz zapoznam Was z zabezpieczaniem od drugiej strony czyli sprawienie, aby dana klasa była ostatnim "potomkiem" w drzewie. "final" w języku Java - oto czego Wam potrzeba!

Oto część druga dotycząca abstrakcji jakim jest słowo kluczowe "abstract" w języku Java. Poprzednio wprowadziłem Was w ten temat bardzo powierzchownie, a teraz zapoznacie się z kolejnym elementem, który bądź co bądź może stanowić jedynie "dekorację" aczkolwiek mogącą zabezpieczyć przed tworzeniem instancji zbyt ogólnego obiektu. Dowiecie się co to jest klasa abstrakcyjna, czym się ona różni od "zwykłej" oraz jak ona wpływa na przebieg pisania kodu w Javie.

Czas poruszyć wątek dziedziczenia! Jest to kolejny element stanowiący zakres podstawowego rozumienia języka Java. Dziedziczenie w języku Java to fundament w paradygmacie obiektowym. Na czym on polega? Jak on działa w programie? Jak go dostrzec w kodzie? Spokojnie, jedno pytanie po drugim zostanie tu omówione.

Dzień zaczyna dobiegać końca, a ja na zachętę przynoszę Wam następne akapity kręcące się wokół języka Java. Opiszemy sobie czym jest statyczność w języku Java. Wiele osób ma problemy z przyswojeniem sobie tematu, który również jest często spotykany i wykorzystywany w praktyce. To brzmi na tyle poważnie, że postanowiłem zabrać się i za zmienne, i za metody statyczne. Nie uciekajcie od tego z krzykiem! To trzeba wreszcie zrozumieć!

Witam Was ponownie! Zbliża się nieuchronnie koniec "mojego miesiąca" i stopniowe zbieranie plonów swojej ciężkiej pracy z pisania na stronie, aczkolwiek nie ma to wpływu na dalsze redagowanie artykułów. Jak dojdę do wyznaczonego progu, wtedy wszystko wyjaśnię. Na razie, zabieramy się znowu za język Java i za wątek przesłaniania, który opisałem wczoraj jeśli ominęliście. Zaprezentuję wyjaśnienie i od razu przesłanianie metody o nazwie "toString" w języku Java. Co to konkretnie jest?

Lecimy z następnym tematem Javy. Weźmiemy pod lupę dwa terminy, które wbrew pozorom nie są synonimiczne. Przeciążanie a przesłanianie w języku Java to pojęcia bardzo podobne do siebie, a oznaczają dwie zupełnie różne rzeczy. Macie przed sobą rozmowę kwalifikacyjną na stanowisko programisty w tym języku? Bądźcie gotowi na to, że to pytanie może paść!

Moim zdaniem starczy już tych wykładów o samym tworzeniu gier. Język C też już wyczerpałem aż nadto, zatem wrócę do Javy i opiszę bardziej podstawowe rzeczy. Na przykład czym jest konstruktor w języku Java. Co to jest. Co on robi. Jak go zdefiniować. Na tym się dzisiaj skupimy.

Skaczemy ponownie do Javy i teraz pokażę Wam jak korzystać z mniej znanej struktury danych kryjącą się pod nazwą "HashMap" w języku Java. Użytkownicy Pythona raczej będą ją nazywali "słownikiem". Ja też wolę to stwierdzenie, natomiast ze względu na zachowanie tagów, będę korzystał naprzemiennie z obu tych nazw. Przejdźmy do wyjaśnienia jak w języku Java korzystać ze słownika.

Znowu artykuł i znowu Java. Dzisiejszym tematem jest przechwytywanie wyjątków w języku Java, dowiemy się co to takiego, jak działa i jak się zabezpieczyć przed niepożądanym działaniem w trakcie korzystania z "ryzykownej" metody za pomocą klauzuli "try-catch". Jeśli nałogowo korzystacie z języka Java, opanujcie to jak najprędzej, to jest jeden z tematów podstawowych.

Powracamy znowu do języka Java. Po raz pierwszy pragnę się wypowiedzieć na temat interfejsów i przykładów ich zastosowania. Aby nikt nie poczuł się zagubiony, artykuł ten będzie podzielony na dwie części: pierwsza będzie służyła wstępnemu tłumaczeniu czym jest interfejs i co ma z tym wspólnego słowo kluczowe "interface" w języku Java, a druga będzie obrazować przykład ich sensownego wykorzystywania. Opowiem Wam także jak można wykorzystać polimorfizm w stosunku do interfejsu i co nam to daje w efekcie końcowym.

Raz kolejny zwrócimy się w stronę Javy w celu przedstawienia bardzo przyjemnego i efektywnego zapisu. Umożliwia on zapisanie "rozciągliwej" funkcji, która będzie w stanie pobierać tyle parametrów ile tylko sobie zażyczycie. Jeden, pięć, nawet dwadzieścia. Taka implementacja jest możliwa jeżeli się wie o jej istnieniu i o sposobie zapisu. Pojęciem tym jest "zmienna liczba parametrów" w języku Java ("variadic function"), sposób zapisu opisuję w środku.

Aby się mocno nie przemęczyć, teraz będzie lekki artykuł rozwiewający wątpliwości na temat Javy. Jak to z nią jest, Java jest kompilowana czy interpretowana? Czy może jedno i drugie? Jakby to Wam napisać, kompilacja w języku Java działa ona pół na pół. Kompiluje się do kodu pośredniego, aby go potem interpretować. Wyjaśnienia zostawiam w środku.

Sięgnę znowu do języka Java, aby jeszcze bardziej oddalić się choć na chwilę od tworzenia gier. Pisało się w nim dostatecznie dużo, żeby móc przedstawić Wam cechy języka Java, których każdy z Was powinien być świadom, jeszcze przed rozpoczęciem nauki. Nie będę zagłębiał się w szczegóły czy jakieś zaawansowane wątki, tu są tylko same konkrety.

Od 2019 roku Java stała się płatna w zakresie wykorzystywania komercyjnego, zatem wszyscy chętni zmuszeni są do wykupienia subskrypcji na określoną edycję. Jak to w życiu bywa, trzeba stale kombinować pod górę jednak można sprawić, aby dalej korzystać z języka za darmo i "na legalu". Na wszelki wypadek warto się zabezpieczyć, aby później uniknąć wszelkiego rodzaju nieprzyjemności. Tym sposobem jest pobranie "alternatywy" pod tytułem "Eclipse Adoptium". Nie muszę pisać, że przed poniższymi czynnościami, należy wpierw usunąć oficjalną Javę CAŁKOWICIE.