Programování

Naučte se Javu od základů

Chcete tedy programovat v Javě? To je skvělé a jste na správném místě. The Řada Java 101 poskytuje samoobslužný úvod do programování v Javě, počínaje základy a pokrývající všechny základní koncepty, které potřebujete znát, abyste se stali produktivním vývojářem Javy. Tato řada je technická a má spoustu příkladů kódu, které vám pomohou pochopit koncepty, jak postupujeme. Předpokládám, že již máte nějaké zkušenosti s programováním, ale ne v Javě.

Tento první článek představuje platformu Java a vysvětluje rozdíl mezi jejími třemi edicemi: Java SE, Java EE a Java ME. Dozvíte se také o roli virtuálního stroje Java (JVM) při nasazování aplikací Java. Pomůžu vám s nastavením sady Java Development Kit (JDK) ve vašem systému, abyste mohli vyvíjet a spouštět programy Java, a seznámím vás s architekturou typické aplikace Java. Nakonec se naučíte, jak sestavit a spustit jednoduchou aplikaci Java.

Aktualizováno pro Javu 12 a nový JShell

Tato řada byla aktualizována pro prostředí Java 12 a obsahuje rychlý úvod do nového jshell: interaktivní nástroj pro učení jazyka Java a vytváření prototypů kódu Java.

stáhnout Získat kód Stáhněte si zdrojový kód například pro aplikace v tomto výukovém programu. Vytvořil Jeff Friesen pro JavaWorld.

Co je Java?

O Javě si můžete myslet jako o univerzálním objektově orientovaném jazyce, který vypadá hodně jako C a C ++, ale který se snadněji používá a umožňuje vytvářet robustnější programy. Tato definice vám bohužel neposkytuje mnoho informací o Javě. V roce 2000 společnost Sun Microsystems (původce platformy Java) popsala Javu takto:

Java je jednoduchý, objektově orientovaný, síťově důvtipný, interpretovaný, robustní, bezpečný, neutrální vůči architektuře, přenosný, vysoce výkonný, vícevláknový a dynamický počítačový jazyk.

Zvažme každou z těchto definic samostatně.

Java je jednoduchý jazyk. Java byla původně modelována po C a C ++, minus některé potenciálně matoucí funkce. Ukazatele, vícenásobná dědičnost implementace a přetížení operátora jsou některé funkce C / C ++, které nejsou součástí Javy. Funkce, která není v C / C ++ nařízena, ale která je pro Javu nezbytná, je zařízení na shromažďování odpadků, které automaticky získává objekty a pole.

Java je objektově orientovaný jazyk. Objektově orientované zaměření Javy umožňuje vývojářům pracovat na přizpůsobení Javy tak, aby řešila problém, než aby nás nutila manipulovat s problémem tak, aby vyhovovala jazykovým omezením. To se liší od strukturovaného jazyka jako C. Jako příklad, zatímco Java umožňuje soustředit se na objekty spořicího účtu, C vyžaduje, abyste o spořicím účtu přemýšleli samostatně. Stát (takový zůstatek) a chování (například vklad a výběr).

Java je síťově zdatný jazyk. Rozsáhlá síťová knihovna Java usnadňuje zvládnutí síťových protokolů Transmission Control Protocol / Internet Protocol (TCP / IP), jako jsou HTTP (HyperText Transfer Protocol) a FTP (File Transfer Protocol), a zjednodušuje vytváření síťových připojení. Programy Java mohou navíc přistupovat k objektům v síti TCP / IP prostřednictvím Uniform Resource Locators (URL) se stejnou lehkostí, jakou byste k nim měli přístup z místního systému souborů.

Java je interpretovaný jazyk. Za běhu se program Java nepřímo spouští na podkladové platformě (jako Windows nebo Linux) prostřednictvím virtuálního stroje (což je softwarová reprezentace hypotetické platformy) a přidruženého prováděcího prostředí. Virtuální stroj překládá program Java bytecodes (instrukce a související data) k instrukcím pro konkrétní platformu prostřednictvím interpretace. Výklad je akt zjišťování, co znamená instrukce bytecode, a následného výběru ekvivalentních „konzervovaných“ instrukcí specifických pro platformu, které mají být provedeny. Virtuální stroj poté provede tyto pokyny specifické pro platformu.

Interpretace usnadňuje ladění vadných programů Java, protože za běhu je k dispozici více informací v době kompilace. Interpretace také umožňuje odložit krok spojení mezi částmi programu Java do doby běhu, což urychluje vývoj.

Java je robustní jazyk. Programy Java musí být spolehlivé, protože se používají jak v aplikacích pro spotřebitele, tak v kritických aplikacích, od přehrávačů Blu-ray po navigační systémy vozidel nebo systémy řízení letového provozu. Mezi jazykové funkce, díky nimž je Java robustní, patří deklarace, kontrola duplicitních typů v době kompilace a běhu (aby se zabránilo problémům s neshodami verzí), skutečná pole s automatickou kontrolou hranic a vynechání ukazatelů. (Chcete-li začít s typy jazyků Java, literály, proměnnými a dalšími, přečtěte si část „Základní funkce jazyka Java“.)

Dalším aspektem robustnosti Javy je, že smyčky musí být řízeny booleovskými výrazy namísto celočíselných výrazů, kde 0 je nepravdivé a nenulová hodnota je pravdivá. Například Java neumožňuje smyčku ve stylu C, jako je while (x) x ++; protože smyčka nemusí skončit tam, kde se očekávalo. Místo toho musíte explicitně zadat booleovský výraz, například while (x! = 10) x ++; (což znamená, že smyčka poběží do X se rovná 10).

Java je zabezpečený jazyk. Programy Java se používají v síťových / distribuovaných prostředích. Protože programy Java mohou migrovat na různé platformy v síti a provádět je, je důležité chránit tyto platformy před škodlivým kódem, který by mohl šířit viry, krást informace o kreditní kartě nebo provádět jiné škodlivé činy. Funkce jazyka Java, které podporují robustnost (jako je vynechání ukazatelů), pracují s funkcemi zabezpečení, jako je model zabezpečení Java sandbox a šifrování veřejného klíče. Společně tyto funkce zabraňují virům a dalším nebezpečným kódům způsobit zmatek na nic netušící platformě.

Teoreticky je Java zabezpečená. V praxi byly zjištěny a zneužity různé chyby zabezpečení. Výsledkem je, že Sun Microsystems a Oracle nyní nadále vydávají bezpečnostní aktualizace.

Java je jazyk neutrální vůči architektuře. Sítě propojují platformy s různými architekturami založenými na různých mikroprocesorech a operačních systémech. Nemůžete očekávat, že Java vygeneruje pokyny specifické pro platformu a nechá tyto pokyny „pochopit“ všemi druhy platforem, které jsou součástí sítě. Místo toho Java generuje instrukce bytecode nezávislé na platformě, které jsou snadno interpretovatelné pro každou platformu (prostřednictvím implementace JVM).

Java je přenosný jazyk. Neutralita architektury přispívá k přenositelnosti. Přenositelnost Javy však má více než poučení bytecode nezávislých na platformě. Vezměte v úvahu, že velikosti celočíselných typů se nesmí lišit. Například 32bitový celočíselný typ musí být vždy podepsán a zabírat 32 bitů, bez ohledu na to, kde je 32bitové celé číslo zpracováno (např. Platforma s 16bitovými registry, platforma s 32bitovými registry nebo platforma s 64bitovými registry). Knihovny Java také přispívají k přenositelnosti. V případě potřeby poskytují typy, které spojují kód Java s funkcemi specifickými pro platformu co nejpřenosnějším možným způsobem.

Java je vysoce výkonný jazyk. Interpretace přináší úroveň výkonu, která je obvykle více než přiměřená. Pro velmi výkonné aplikační scénáře používá Java kompilaci just-in-time, která analyzuje interpretované sekvence instrukcí bytecode a kompiluje často interpretované sekvence instrukcí do instrukcí specifických pro platformu. Následné pokusy interpretovat tyto sekvence instrukcí bytecode vedou k provedení ekvivalentních instrukcí specifických pro platformu, což má za následek zvýšení výkonu.

Java je vícevláknový jazyk. Pro zlepšení výkonu programů, které musí splnit několik úkolů najednou, podporuje Java koncept závitové provedení. Například program, který spravuje grafické uživatelské rozhraní (GUI) během čekání na vstup ze síťového připojení, používá jiné vlákno k provedení čekání místo použití výchozího vlákna GUI pro obě úlohy. Díky tomu bude grafické uživatelské rozhraní reagovat. Synchronizační primitivy Java umožňují vláknům bezpečně komunikovat data mezi sebou bez poškození dat. (Viz vláknové programování v Javě popsané jinde v řadě Java 101.)

Java je dynamický jazyk. Protože propojení mezi programovým kódem a knihovnami probíhají dynamicky za běhu, není nutné je explicitně propojovat. Výsledkem je, že když se program nebo některá z jeho knihoven vyvíjí (například pro opravu chyby nebo zlepšení výkonu), vývojáři stačí distribuovat aktualizovaný program nebo knihovnu. Ačkoli dynamické chování má za následek méně kódu k distribuci, když dojde ke změně verze, tato zásada distribuce může také vést ke konfliktům verzí. Například vývojář odebere typ třídy z knihovny nebo jej přejmenuje. Když společnost distribuuje aktualizovanou knihovnu, stávající programy závislé na typu třídy selžou. Aby se tento problém výrazně snížil, Java podporuje typ rozhraní, což je jako smlouva mezi dvěma stranami. (Viz rozhraní, typy a další objektově orientované jazykové funkce popsané jinde v řadě Java 101.)

Rozbalení této definice nás hodně naučí o Javě. A co je nejdůležitější, odhaluje, že Java je jazyk i platforma. Více o komponentách platformy Java - konkrétně o virtuálním stroji Java a prostředí pro provádění Java - se dozvíte dále v tomto kurzu.

Tři vydání Java: Java SE, Java EE a Java ME

Sun Microsystems vydal sadu pro vývoj softwaru Java 1.0 (JDK) v květnu 1995. První JDK byl použit k vývoji desktopových aplikací a appletů a Java se následně vyvinula tak, aby zahrnovala programování podnikových serverů a mobilních zařízení. Uložení všech potřebných knihoven do jediného JDK by způsobilo, že JDK bude příliš velký na distribuci, zejména proto, že distribuce v 90. letech byla omezena malými disky CD a nízkou rychlostí sítě. Protože většina vývojářů nepotřebovala každé poslední API (vývojář desktopových aplikací by sotva potřeboval přístup k podnikovým Java API), Sun rozdělil Javu do tří hlavních vydání. Ty se nakonec staly známými jako Java SE, Java EE a Java ME:

  • Java Platform, Standard Edition (Java SE) je platforma Java pro vývoj aplikací na straně klienta (běžících na počítačích) a appletů (běžících ve webových prohlížečích). Z bezpečnostních důvodů již applety nejsou oficiálně podporovány.
  • Java Platform, Enterprise Edition (Java EE) je platforma Java postavená na platformě Java SE, která se používá výhradně k vývoji podnikových serverových aplikací. Zahrnují aplikace na straně serveru Servlety Java, což jsou programy Java, které jsou podobné appletům, ale běží spíše na serveru než na klientovi. Servlety odpovídají API Java Servlet.
  • Java Platform, Micro Edition (Java ME) je také postaven na Java SE. Jedná se o platformu Java pro vývoj MIDlety, což jsou programy Java, které běží na mobilních informačních zařízeních, a Xlety, což jsou programy Java spuštěné na integrovaných zařízeních.

Java SE je základní platformou pro Javu a je zaměřena na řadu Java 101. Příklady kódu budou založeny na nejnovější verzi Java v době psaní, Java 12.

Platforma Java a JVM

Java je programovací jazyk a platforma pro běh kompilovaného kódu Java. Tato platforma se skládá hlavně z JVM, ale také zahrnuje prostředí pro provádění, které podporuje provádění JVM na podkladové (nativní) platformě. JVM obsahuje několik komponent pro načítání, ověřování a provádění kódu Java. Obrázek 1 ukazuje, jak se program Java provádí na této platformě.

Jeff Friesen

V horní části diagramu je řada souborů tříd programů, z nichž jeden je označen jako hlavní soubor třídy. Program Java se skládá alespoň z hlavního souboru třídy, což je první soubor třídy, který se má načíst, ověřit a spustit.

JVM deleguje načítání třídy na svou komponentu Classloader. Classloaders načítají soubory tříd z různých zdrojů, jako jsou systémy souborů, sítě a archivní soubory. Izolují JVM od složitosti načítání tříd.

Načtený soubor třídy je uložen v paměti a reprezentován jako objekt vytvořený z Třída třída. Po načtení ověřovatel bytecode ověří různé pokyny bytecode, aby se ujistil, že jsou platné a neohrozí bezpečnost.

Pokud jsou bytové kódy souboru třídy neplatné, JVM končí. Jinak interpretuje jeho komponenta interpretaci bytecode po jedné instrukci. Interpretace identifikuje instrukce bytecode a provádí ekvivalentní nativní instrukce.

Některé sekvence instrukcí bytecode se provádějí častěji než jiné. Když tlumočník detekuje tuto situaci, kompilátor JVM just-in-time (JIT) kompiluje sekvenci bytecode do nativního kódu pro rychlejší provedení.

Během provádění se tlumočník obvykle setká s požadavkem na provedení bajtového kódu jiného souboru třídy (patřícího k programu nebo do knihovny). Když k tomu dojde, načte classloader soubor třídy a ověřovatel bytecode ověří bytecode načteného souboru třídy před jeho spuštěním. Také během provádění mohou pokyny bytecode vyžadovat, aby JVM otevřel soubor, zobrazil něco na obrazovce, vydal zvuk nebo provedl jiný úkol vyžadující spolupráci s nativní platformou. JVM reaguje pomocí své technologie mostu Java Native Interface (JNI) pro interakci s nativní platformou za účelem provedení úkolu.

$config[zx-auto] not found$config[zx-overlay] not found