Syntaxe Java
Syntaxe je Java programovací jazyk je definován ve specifikaci jazyka Java , jako je tomu v sémantiky Javy.
Tento článek poskytuje přehled syntaxe Java a zdůrazňuje některá její specifika. Podrobnosti jsou uvedeny ve specifikaci jazyka Sun Microsystems Java .
terminologie
Protože Java je programovací jazyk, jehož popis se používá hlavně v anglickém jazyce, ale v literatuře se také používají německé překlady určitých komponent, měla by být v tomto bodě vyjasněna nejednoznačnost a rovněž by měly být specifikovány výrazy použité v tomto článku, aby nedošlo k záměně lze vyloučit. Následují pojmy použité v tomto článku a jejich anglické nebo německé ekvivalenty.
- Výraz
- (Engl. Expression ) Výrazem se rozumí jakýkoli složitý jazykový konstrukt, jehož vyhodnocení vede k jediné dobře definované hodnotě. V nejjednodušším případě je výraz konstanta, například Např. Klíčové slovo true nebo číslo (např. 1 nebo 0x7fff ). Složitějšími výrazy jsou srovnání nebo výpočty s více proměnnými a konstantami. V gramatických popisech se často rozlišuje mezi různými typy výrazů (např. Číselné, doslovné atd.), Což by zde nemělo být.
- Návod
- (Anglicky. Statement , Instruction or Command ; also called command ) V Javě, stejně jako v mnoha jiných imperativních programovacích jazycích, se instrukce vztahuje k jedinému pravidlu, které má být provedeno v rámci provádění programu. To zahrnuje deklaraci proměnných, výrazy ukončené středníky, řídicí struktury, bloky instrukcí, instrukce skoku, synchronizační bloky, návrat hodnot a spouštění výjimek.
- Blok výpisů
- (Engl. Statement Block ) Blok instrukcí se používá ke seskupení více instrukcí. To znamená, že několik příkazů lze interpretovat jako jeden příkaz, což je požadavek některých jazykových konstrukcí - například řídicích struktur.
Lexikální struktura
Programy Java jsou psány v Unicode . Na rozdíl od jiných jazyků mohou identifikátory tříd, metod, proměnných atd. Obsahovat nejen písmena latinky a číslice, ale také znaky z jiných abeced, například B. Německé přehlásky nebo čínské znaky.
Všechna klíčová slova v Javě jsou psána malými písmeny, např. B. „ class“ nebo „ if“.
Symboly písmen (anglické literály ) jsou v Javě, nejmenší možné výrazy pro čísla, jednotlivé znaky, řetězce znaků ( řetězce ), logické hodnoty ( truenebo false) a konkrétní slovo null.
Oddělovač (anglické oddělovače ) jsou různé typy složených závorek a čárek, teček a středníků.
Java zná logické , srovnávací a matematické operátory běžné v programovacích jazycích . Syntaxe je založena na programovacím jazyce C ++ . Například jedno znaménko rovná se „ =“ se používá jako operátor přiřazení, zatímco dvojité znaménko „ ==“ se používá pro srovnání .
Mezery, konce řádků a komentáře lze vložit kamkoli mezi identifikátory, klíčová slova, symboly písmen, oddělovače a operátory.
syntax
Typy dat
Java zná dva typy dat : primitivní datový typ a odkazy na objekty. Primitivní datové typy jsou jedním z důvodů, proč Java není striktně objektově orientovaný jazyk.
Primitivní datové typy
Existuje osm primitivních datových typů. Mají různé velikosti a vlastnosti a používají se k výpočtu a ukládání diskrétních číselných hodnot. Všechny tyto datové typy mají pevnou velikost, která je pro všechny platformy stejná. Pro každý typ existuje odpovídající obálka třídy, takže s nimi lze zacházet také jako se skutečnými objekty.
| Datový typ | Velikost (a) | Obalová třída | Rozsah hodnot | popis |
|---|---|---|---|---|
| booleovský | 1 bit | java.lang.Boolean | true / false | Booleovská hodnota pravdy |
| char | 16 bitů | java.lang. znak | U + 0000… U + FFFF |
Znak Unicode (= symbol) (např. 'A'Nebo '\uC3A4')
|
| byte | 8 bitů | java.lang.Byte | −128 ... +127 | Hodnota doplňku dvou |
| krátký | 16 bitů | java.lang. krátká | -32 768 ... + 32 767 | Hodnota doplňku dvou |
| int | 32 bitů | java.lang.Integer | −2 147 483 648… + 2 147 483 647 | Hodnota doplňku dvou |
| dlouho | 64 bitů | java.lang.Long | −9 223 372 036 854 775 808… + 9 223 372 036 854 775 807 |
Hodnota doplňku dvou |
| plovák | 32 bitů | java.lang.Float | ± 1,4E - 45… ± 3,4E + 38 | Číslo s plovoucí desetinnou čárkou ( IEEE 754 ) |
| dvojnásobek | 64 bitů | java.lang.Double | ± 4,9 E - 324… ± 1,7E + 308 | Číslo s plovoucí desetinnou čárkou s dvojitou přesností (IEEE 754) |
Obsadit
Hierarchii pro převod ( typování ) primitivních datových typů lze uhodnout z výše uvedené tabulky. Numerické datové typy lze převést na další větší datový typ bez ztráty, ale ne naopak. „ int“ Lze implicitně převést bez speciálního operátoru na „ long“, ale ne naopak.
int i = 12345;
long l = i;
Chcete-li však převést například „ long“ na „ int“ v opačném směru , je nutné použít operátor převodu typu. V tomto procesu lze také ztratit informace.
long l = 12345678901L;
int i = (int) l;
Zde dochází ke iztrátě informací: „ “ má po přiřazení hodnotu −539222987, protože významnější bajty jsou oříznuty.
Primitivní datový typ „ boolean“ nelze převést na jiný datový typ. Znaky typu „ char“ lze implicitně převést na jakýkoli celočíselný typ z „ int“. To je způsobeno zejména skutečností, že „ char“ je jediný nepodepsaný datový typ známý v Javě. Z shorthodnoty 32768 již není možný bezztrátový převod na „ “.
pověření
Všechny objekty a pole jsou v paměti haldy, a proto se na ně odkazuje prostřednictvím adresy. Přístup k objektům v Javě je implementován pomocí odkazů, které jsou podobné ukazatelům známým z C / C ++. Definice jazyka (Java Language Specification) je označuje jako „referenční hodnoty“, aby bylo jasné, že jsou přenášeny podle hodnoty . V Javě neexistuje přímý způsob, jak zobrazit adresu paměti odkazu nebo ji upravit, což vylučuje takzvanou aritmetiku ukazatele v Javě.
Object a = new Object(); // a referenziert das gerade neu erstellte Objekt
Object b = a; // b referenziert dasselbe Objekt wie a
a = null; // a referenziert kein Objekt mehr, enthält somit die reservierte Adresse null.
Zde je třeba poznamenat, že znakové řetězce (třída String) také představují referenční typy, a proto je nutné jejich obsah vždy equals()porovnávat pomocí metody (" ==" pouze kontroluje odkazy, tj. Adresy paměti). To je na rozdíl od programovacích jazyků, jako jsou C ++ a C # , které podporují plné přetížení operátorů a "hallo"=="hallo"provádějí srovnání obsahu.
Vyhrazená slova
consta gotojsou vyhrazeny, ale bez funkce, takže žádná klíčová slova ve skutečném smyslu. Slouží pouze kompilátoru k výstupu užitečných chybových zpráv pro ty, kteří přecházejí z C ++ nebo C.
true, falsea nulljsou literály, ale také ne ve skutečnosti klíčová slova v užším slova smyslu.
S assertjsou tvrzení realizované.
private, protectedA publicjsou modifikátory přístupu ( modifikátor přístupu ):
| Třída sama | Balíkové třídy / vnitřní třídy |
Podtřídy | Ostatní třídy |
|
|---|---|---|---|---|
| soukromé | Ano | Ne | Ne | Ne |
| (bez) | Ano | Ano | Ne | Ne |
| chráněný | Ano | Ano | Ano | Ne |
| veřejnost | Ano | Ano | Ano | Ano |
-
↑ Chcete-li povolit vnitřním třídám přístup k soukromým metodám a vlastnostem, kompilátor vytvoří statické metody soukromé pro balíček, které emulují volání, nastavení nebo čtení. Tyto metody mají název
access$xxx, kde znamenáxxxpořadové číslo. - ↑ Často se označuje jako „balíček soukromý“, i když tento modifikátor přístupu neexistuje.
Soukromé metody jsou z polymorfismu vyloučeny; H. definování metody se stejným podpisem v podtřídě se nepovažuje za přepsání (ale spíše za skrytí ).
staticidentifikuje implementace, které lze použít bez odkazu na objekt. Klíčové slovo se používá při deklaraci polí, metod a vnitřních tříd. Pole, metody a třídy, které jsou staticoznačeny, lze použít v kontextu třídy a nejsou spojeny s žádným objektem .
abstractse mohou objevit před třídami a metodami . Abstraktní metody nemají žádnou implementaci a musí být přepsány v odvozených třídách. Třídy, které obsahují abstraktní metody, musí být prohlášeny za abstraktní. Abstraktní třídy nelze vytvořit instanci, i když jsou plně implementovány, například B. v případě tříd adaptérů EventListener rámce Swing .
finalmůže stát před proměnnými , poli, metodami a třídami a vynucovat neměnnost. V případě proměnných a členských proměnných jejich stálost, v případě metod nemožnost jejich přepsání v odvozených třídách a konečně v případě tříd, že z nich nelze provádět žádné další derivace. Konečné proměnné je přiřazena jednorázová hodnota, kterou nelze poté změnit. Konečná proměnná nemusí být inicializována v deklaraci, ale může být přiřazena pouze jednou v následujících alternativních pokynech:
public int calcFinal(int a) {
final int b; // hier findet noch keine Zuweisung statt
switch (a) {
case 1:
b = 7;
break;
case 2:
b = 3;
break;
default:
b = 1;
break;
}
return b;
}
Přístup k konečným proměnným, jejichž hodnota je kompilátoru známa, může být nahrazen kompilátorem s hodnotou proměnné. Kompilátor může nahradit volání finálních metod vloženým kódem (vložením). Soukromé metody jsou automaticky konečné.
nativese může objevit pouze před metodami a znamená, že implementace dané metody nebyla napsána v Javě, ale v jiném programovacím jazyce a musí být integrována virtuálním strojem prostřednictvím běhové knihovny.
strictfpIdentifikuje třídy a metody, jejichž operace s plovoucí desetinnou čárkou musí přísně dodržovat IEEE 754 .
packagedeklaruje balíček patřící ke složitému datovému typu. Název balíčku by měl být jasný a obvykle vychází z internetové domény vlastníka nebo tvůrce.
importimportuje symboly (dříve pouze typy, z prostředí Java 5 také statické členy tříd), aby je bylo možné použít bez plně kvalifikovaných jmen. Import lze *rozšířit na kompletní balíčky pomocí zástupného znaku .
boolean, char, byte, short, int, long, floatA doublejsou typy. voidnetypický je nezbytný k identifikaci metod bez návratových hodnot. Pro primitivní typy: viz výše.
class, interface, enumA @interfaceslouží deklarovat své vlastní typy: třídy, rozhraní (rozhraní pro výuku), výčty ( typ výčtu u typu-safe výčtu, anglický typ bezpečné výčtu ) a anotace metadat. enuma @interfacebyly začleněny do jazyka s Java 5.
try, catch, finally, throw, throwsPodívejte se na zpracování výjimek (v angličtině zpracování výjimek ). S throwvýjimkou je vyvolána. Jakékoli výjimky vyvolané metodou, které nejsou odvozeny z RuntimeExceptionnebo Errormusí být throwszadány v deklaraci metody. Jedná se o takzvané kontrolované výjimky . tryobklopuje blok, ve kterém by mohlo dojít k výjimce. catchzachytí tryvýjimku, která nastala po bloku, finallyje připojena k trynebo catchbloku pro účely čištění, jako je zavírání souborů.
extendsa implementsslouží k dědičnosti: dědičnost extendsgenetického rozšíření z třídy do třídy nebo rozhraní k rozhraní a dědičnost implementsimplementace z rozhraní do třídy. Kromě toho extendsse pro rozšíření typu používají generika.
supera thisvztahují se v kontextu objektu k aktuálnímu objektu v jeho skutečném morph ( this) nebo v morph superclass ( super). thisse používá k volání konstruktorů přetížených v konstruktorech ak odkazování na skryté členy vnějších struktur v členech. superse používá v konstruktorech k volání konstruktoru nadtřídy a v přepsání metod k volání přepsané metody. Kromě toho superse pro vymezení typů používají generické typy.
newrezervuje paměť pro nové objekty (včetně polí) na haldě .
if, else, switch, case, default, while, do, for, break, continueSlouží provozu Testovací a smyčky kontroly a využívat imperativním syntaxe.
return vrací hodnoty z metody do volající metody.
volatileje modifikátor pro nelokální proměnné a zakazuje kompilátoru JIT registrovat optimalizace pro tuto proměnnou, protože několik podprocesů je může používat současně (zejména v kontextu nativních metod).
synchronizedIdentifikuje kritickou část ve zdrojovém kódu, kterou lze spustit pouze jedním vláknem najednou. Monitor uzamkne část jakmile nit ji přejde. Pokud se jiné vlákno pokusí vstoupit do blokované sekce, toto vlákno se zablokuje, dokud monitor sekci neuvolní. Jako monitor lze použít jakýkoli objekt Java. Pokud je metoda synchronizedoznačena, objekt nebo, v případě statických metod, objekt třídy se používá jako monitor.
transient identifikuje netrvalé proměnné, které nesmí být serializovány.
instanceof je operátor Java, který kontroluje, zda je objekt instancí zadaného typu nebo podtypu.
Balíčky, názvy, třídy, rozhraní
Java balíček obsahuje několik tříd, rozhraní a výjimky a vytváří svůj vlastní prostor jmen .
Zdrojový text Java je rozdělen do několika kompilačních jednotek , z nichž každá je uložena ve vlastním souboru. Každá jednotlivá překladová jednotka nejprve definuje balíček, do kterého patří, poté importuje několik tříd nebo rozhraní z jiných balíčků a nakonec definuje jednu nebo více tříd a rozhraní.
Java rozlišuje mezi jednoduchými jmény, které se skládají pouze z jednoho identifikátoru, a plně kvalifikovanými jmény, které se skládají z řady identifikátorů oddělených tečkami. Jednoduché názvy slouží pouze k záchraně psaní programátoru a ke zvýšení čitelnosti programu. Kompilátor je vždy překládá do plně kvalifikovaných jmen.
Následující příklad ukazuje program Hello World v Javě.
package org.wikipedia;
import static java.lang.System.out;
public class HalloWelt {
public static void main(String[] arguments) {
out.println("Hallo Welt.");
}
}
V tomto příkladu HalloWeltje definována třída „ “, která org.wikipediapatří do balíčku „ “. Podle konvence jsou názvy balíčků v Javě založeny na internetových doménách jejich vývojářů, v tomto případě org.wikipediapro doménu „ wikipedia.org“. Směr názvu je obrácený, protože v internetových doménách je název nejvzdálenější jednotky vzadu, zatímco v Javě je vpředu. Balíček „ org.wikipedia“ je tedy „v rámci“ balíčku „ org“.
Prohlášení o importu definuje jednoduchý název pro plně kvalifikovaný název. Tak definované např. Například instrukce „ import java.io.File“ dává jednoduchý název „ File“ pro třídu, jejíž celé jméno je „ java.io.File“. Kromě importu tříd a rozhraní lze od verze Java 5 importovat také statická pole nebo metody tříd. Takový „statický import“ je definován dalším klíčovým slovem „ static“. Ve výše uvedeném příkladu je statické pole outtřídy „ java.lang.System“ importováno a poté použito pod krátkým názvem „ out“.
Nejdůležitější konstrukcí programovacího jazyka Java, protože se jedná o objektově orientovaný jazyk, je třída . Deklarace třídy je zavedena s klíčovým slovem „ class“. Poté následuje název třídy a poté - v kudrnatých závorkách - jsou definována pole a metody třídy.
Rozhraní je specializací prostředí Java, které se skládá pouze z deklarací metod, jejichž implementaci určují pouze třídy, které je „implementují“. Deklarace rozhraní vypadá podobně jako deklarace třídy, ale je zavedena pomocí klíčového slova „ interface“.
package org.wikipedia;
public interface Article {
String getName();
void setContent(String aContent);
}
Protože všechny metody rozhraní jsou abstraktní, lze klíčové slovo „ abstract“ pro jednotlivé metody vynechat. Klíčové slovo „ public“ před jednotlivými metodami lze také vynechat, protože metody rozhraní jsou vždy veřejné.
Od prostředí Java 8 existuje také možnost defaultdefinování statických metod a metod v rozhraních . Kromě toho lze rozhraní označit „ @FunctionalInterface“, což znamená, že se jedná o funkční rozhraní. Takové je definováno deklarováním právě jedné abstraktní metody; anotace pro to není nutná. Funkční rozhraní lze v kostce implementovat pomocí výrazů lambda nebo odkazů na metody.
Metody
Skutečné chování objektu je definováno v metodách. Podpis metody se skládá z jejího názvu a typy jejích parametrů. Každá metoda má také specifický návratový typ, nebo " void" pokud nic nevrací, a může throwsdefinovat řadu výjimek v tzv . Klauzuli.
Příklad konkrétní metody:
public double summe(double a, double b) throws NotANumberException {
if (Double.isNaN(a) || Double.isNaN(b)) {
throw new NotANumberException();
}
return a + b;
}
Tato metoda očekává dvě čísla s plovoucí desetinnou čárkou s dvojitou přesností jako parametry a také vrátí součet dvou jako čísla s plovoucí desetinnou čárkou. Pokud ani jedno z nich není platné číslo s plovoucí desetinnou čárkou, metoda vyvolá výjimku s názvem „ NotANumberException“.
Příklad abstraktní metody:
public abstract double summe(double a, double b) throws NotANumberException;
Atributy
Atributy jsou proměnné, které patří k objektu. Jsou definovány typem a názvem a lze je volitelně inicializovat při vytvoření objektu.
Příklad deklarace proměnné bez inicializace:
private int x;
Proměnné třídy jsou deklarovány jako statické atributy. Tyto atributy neexistují jednou pro každý objekt, ale pouze jednou pro každou třídu. Klíčové slovo „ final“ zabrání proměnné ve změně její hodnoty po její inicializaci. Používá se například k definování konstant.
Příklad deklarace proměnné statické a konečné třídy s inicializací:
private static final int X = 2;
Pole
V programovacím jazyce Java je pole (anglické pole ) nezávislým objektem. To může přijímat data typu uvedeného v prohlášení. Paměť je obsazena, pouze když je pole inicializováno. K tomu je třeba zadat délku ( velikost ), která popisuje, kolik prvků typu by pole mělo mít. Velikost pole je pevná a nelze jej po vytvoření instance změnit. V Javě je pole vždy indexováno kladným celým číslem. To omezuje možnou délku pole na 0 až 2 31 - 1.
Jednotlivé prvky pole - analogicky k atributům jiných objektů - se při vytvoření instance pole inicializují nulovou hodnotou příslušného základního typu pole. Pro pole numerických primitivních typů je to 0 nebo 0,0, pro pole se základním typem boolean je to hodnota false, pro pole odkazů na objekty je to prázdný odkaz null. Při vytváření pole odkazů na objekty se kromě samotného pole nevytváří žádné objekty.
V Javě nejsou žádná skutečná vícerozměrná pole. Je však možné vytvořit vícerozměrná pole vnořením polí do polí. V případě dvourozměrného pole se nejprve vytvoří pole, které může obsahovat odkazy na pole požadovaného typu. Každému místu v tomto poli je poté přiřazen odkaz na jednorozměrné pole požadovaného základního typu.
Jednorozměrné pole
prohlášení
<Datentyp>[] <Variablenbezeichner>; // Deklaration
<Datentyp> <Variablenbezeichner>[]; // Alternative Deklaration (seltener verwendet)
Datový typ pole je uveden v prohlášení. Není však přiděleno žádné pole, ale stejně jako u všech ostatních objektů je definován pouze odkaz typu, kterému lze pole přiřadit.
Instance
<Variablenbezeichner> = new <Datentyp>[<Anzahl>]; // Instanziierung eines eindimensionalen Feldes
Při vytváření instance jednorozměrného pole musí být znám jak jeho datový typ, tak počet prvků. Jak je uvedeno na začátku, délka pole je omezena na nezáporné celočíselné hodnoty. Klíčové slovo zde newmá stejný význam jako u všech ostatních objektů a vytváří instanci typu. Požadovaná paměť je vyhrazena pro objekt i pro jeho prvky. Na rozdíl od jiných objektů však pole nemají žádné konstruktory a není možné vytvářet podtypy typu pole prostřednictvím explicitní derivace.
Příklad jednorozměrného pole typu int s délkou 3
int[] feld = new int[3]; // auf der linken Seite wird die Objektreferenz deklariert
// auf der rechten Seite wird das Feld initialisiert
Deklarace a vytváření instancí nemusí být prováděny samostatně, ale lze je jako obvykle zapsat jako jednu instrukci. Při přístupu k prvkům mějte na paměti, že Java začíná počítat s indexem 0. V tomto příkladu je první prvek přístupný s indexem 0 a poslední prvek s indexem 2.
int[] feld = {1,2,3}
je zkrácení
int[] feld = new int[3];
feld[0]=1;
feld[1]=2;
feld[2]=3;
Čtení hodnot
int a = feld[0]; // das Auslesen erfolgt durch Angabe des Index
objekt.methode(feld[1]); // Einzelwerte eines Feldes können wie Variablen des gleichen Typs verwendet werden
int b = feld[3]; // würde in diesem Beispiel eine IndexOutOfBoundsException auslösen, da es kein 4. Element gibt
Přiřazení hodnot
feld[0] = 5; // Java ist "nullbasiert"
feld[1] = (int) 2.7; // bei Zuweisungen muss wie bei normalen Variablen der Typ angepasst werden
feld[2] = 0; // die Indexierung läuft immer bis n-1
Délka pole
Mnoho algoritmů vyžaduje délku pole, například pro zpracování všech záznamů. Délka pole je známá za běhu a lze ji lengthzjistit pomocí proměnné objektu , která je sama o sobě typu int. Tato proměnná je vždy konstantní a nelze ji změnit. Není proto možné přiřadit jinou hodnotu.
int len = feld.length; // Liest die Länge des Feldes aus und speichert sie in der Variablen len
feld.length = 5; // diese Zuweisung würde einen Fehler beim Kompilieren ergeben, da sie nicht zulässig ist
Vícedimenzionální pole
Jak již bylo uvedeno, Java nerozpoznává vícerozměrná pole. Pole však mohou být navzájem vnořena, aby se získala analogická struktura. Dvourozměrné pole je srovnatelné s tabulkou, přičemž první (vnější) indexovací pole by odkazovalo na řádek. Samotný řádek je zase pole, jehož indexy odkazují na sloupec řádku, tj. Na odpovídající položku, jak je také vidět na obrázku.
V Javě lze vícerozměrná pole implementovat zadáním několika párů hranatých závorek [], přičemž každý pár představuje další dimenzi pole. Vnější pole, které označuje další vnitřní, je na levé straně nebo je dvojicí závorek, která byla definována jako první. To lze vidět na příkladu obrázku, který by se normálně [y][x]indexoval, přičemž nejprve se určí řádek (y) a poté sloupec (x) z řádku.
Příklad vytvoření dvourozměrného pole
double[][] feld = new double[zeilen][spalten];
V tomto příkladu je třeba poznamenat, že je přiděleno nejen vnější pole (zde nazývané pole ), ale také pole pro „řádky“. Nejsou tedy nulové a byly také vytvořeny. Podle očekávání z jednorozměrného pole jsou vaše položky inicializovány 0 .
V matici se vodorovná pole nazývají řádky, svislá pole se nazývají sloupce. Jednotlivé prvky jsou jednoznačně určeny příslušným indexem řádků a sloupců. Syntaxe pro matici nebo obecně pro vícerozměrná pole je téměř identická. Rozdíl spočívá v počtu uzavřených hranatých závorek, které vám řeknou, kolik dimenzí bude mít pole.
Příklad vytvoření dvourozměrného pole s různými velikostmi v „dílčích polích“
double[][] feld = new double[3][];
feld[0] = new double[3];
feld[1] = new double[2];
feld[2] = new double[1];
V tomto příkladu je třeba poznamenat, že v prvním příkazu je přiděleno pouze vnější pole (zde nazývané pole ) a jednotlivé prvky jsou inicializovány nulou . V následujících příkazech jsou tyto prvky poté přiřazeny k „podpole“, což má za následek „trojúhelníkové“ pole.
Stejně jako u jednorozměrných polí existuje také zkrácená verze vícerozměrných polí:
int[][] array2D={{1,2,3},{4,5,6}};
//Entspricht "=new int[2][3];" mit den darauf folgenden Zuweisungen
//"array2D[0][0]=1;"
//"array2D[0][1]=2;"
//(...)
//"array2D[1][2]=6;"
Místo hranatých závorek ([]) je na programátorovi:
int[][] A
je stejné jako
int A[][]
nebo
int[] A[]
Obecná syntaxe
<Datentyp> []… <Feldvariable> = new <Datentyp> [<Anzahl>]… ;
Tyto elipsy ‚...‘ představují další dvojice držáků, z nichž každá vytváří další rozměr. Přístup k prvkům je obdobný jako u jednorozměrného pole. Je však třeba poznamenat, že příslušné vnější pole lze také zpřístupnit např. B. určit počet řádků. Na základě příkladu dvourozměrného pole lze počet určit následujícím způsobem.
Čtení a přiřazování hodnot
double wert = feld[y][x]; // liefert den Wert des Feldes x,y
feld[y][x] = wert; // weist dem Feld x,y einen Wert zu
Stanovení délky pole a podpolí
int zeilenanzahl = feld.length; // weist der Variable "zeilenanzahl" den Wert von "feld.length" zu
Délka podpolí může být určena pomocí indexu pole.
int spaltenanzahl = feld[index].length; // weist der Variable "spaltenanzahl" den Wert von "feld[index].length" zu
V dlouhé formě nebo rozčleněné do jednotlivých kroků by to vypadalo takto. To také ukazuje, že čáry jsou objekty - jednorozměrná pole.
double[] zeilenfeld = feld[index]; // ermittelt das erste "Unterfeld" mit gegebenen Index
int spaltenanzahl = zeilenfeld.length; // weist der Variable "spaltenanzahl" den Wert von "zeilenfeld.length" zu
Pokyny a kontrolní struktury
Java podporuje obvyklé pokyny, které jsou známé také z jiných imperativních programovacích jazyků. Jednoduché pokyny jsou ukončeny středníkem . Několik instrukcí lze kombinovat a vytvořit blok instrukcí pomocí složených závorek. S řídicími strukturami se také zachází jako s bloky, a proto je není nutné (až na jednu výjimku) ukončit středníkem.
Jako kontrolní struktury jsou v podmíněného příkazu a větvení a case , i když - Do-while - a pro smyčce a jeho různé formy jsou k dispozici.
Podmíněné prohlášení a větev
Podmíněný příkaz a větve , označované v následujícím jako if , umožňuje příkazy, které mají být provedeny s výhradou určitých podmínek. K tomu se používá klíčové slovo „if“. Poté následuje dvojice kulatých závorek, ve kterých lze definovat podmínku. Podmínkou je výraz, který jako výsledek musí vrátit logickou hodnotu ( true nebo false ). Tím se Java odlišuje od jiných jazyků, například C, kde jsou jako podmínky povoleny i jiné hodnoty. Je třeba také poznamenat, že často se vyskytující klíčové slovo „then“ neexistuje.
Klíčové slovo „else“ lze použít k provedení příkazu v případě, že podmínka není splněna. Je volitelný a v tomto případě se nazývá větev, protože je proveden první nebo druhý příkaz. Alternativně lze místo „else“ použít „else if“, které stejně jako první „if“ očekává další podmínku. To umožňuje stavět kaskády větví. Bez strukturování pomocí bloků (složené závorky) však existuje riziko visení jinde , ve kterém není jasné, kterému příkazu If má být přiřazena větev Else.
Obecná syntaxe
if (<Bedingung>)
<Anweisung>;
else
<Anweisung>;
Příklad jednoduchého příkazu If s blokem dvou výstupů
if (i < 0) {
System.out.print("Die Zahl ist negativ"); // Bedingte Ausgabe
System.out.println(); // Zeilenumbruch auf der Konsole
}
Složitější příklad
if (i < 0) {
System.out.println("Die Zahl ist negativ");
}
else if (i == 0) {
System.out.println("Die Zahl ist Null");
}
else if (i < 5) {
System.out.println("Die Zahl ist kleiner als 5");
}
else {
System.out.print("Die Zahl ist größer oder gleich 5");
}
Ternární operátor
Pro jednoduchý příkaz If existuje další zkratka. To lze použít ve výrazu, ale je omezeno na „buď-nebo“. Tj. v každém případě musí vrátit konkrétní hodnotu. Samotný operátor je otazník „?“ kterému musí předcházet logický výraz. Návratová hodnota pro případ, že logický výraz je pravdivý, následuje za otazníkem. Poté následuje dvojtečka ':', po které musí následovat návratová hodnota, pokud logický výraz není pravdivý (nepravda).
syntax
<Bedingung> ? <Ausdruck> : <Ausdruck>
příklad
int a = (i<0) ? -i : i; // kehrt vor der Zuweisung an a das Vorzeichen von i um, wenn i negativ ist (Betrag von i)
Přepnout prohlášení
- Rozdíl mezi případy, kdy výrazem může být znak, celé číslo, řetězec znaků nebo typ výčtu.
switch (''Ausdruck'') {
case ''Konstante1'': ''Anweisung1''; break;
case ''Konstante2'': ''Anweisung2''; break;
default: ''Anweisung3'';
}
mletí
Java rozlišuje čtyři různé typy smyček .
- Opakujte příkaz, dokud je podmínka pravdivá, přičemž podmínka je zkontrolována před příkazem ( while smyčka ).
while (''Bedingung'') ''Anweisung'';
- Opakování instrukce, pokud je podmínka pravdivá, přičemž podmínka se kontroluje až po provedení ( smyčka do-while ).
do ''Anweisung''; while (''Bedingung'');
- Inicializuje hodnotu, opakuje příkaz, dokud je podmínka pravdivá, a provede druhý příkaz po každém průchodu smyčky ( pro smyčku ).
for (''Initialisierung''; ''Bedingung''; ''Anweisung2'') ''Anweisung1'';
- Kromě toho existuje rozšířená smyčka for, známá také jako smyčka foreach, která umožňuje provádění příkazů pro každý prvek iterovatelného objektu ( sekvence , seznamy atd.).
for (''Element'' : ''Kollektion'') ''Anweisung'';
Následující příklady ukazují použití takové rozšířené smyčky for, aplikované jednou na základní datový typ chara jednou na seznam.
char[] chars = new char[] { 'a', 'b', 'c' }; // neues Zeichen-Array anlegen
for (char c : chars) {
System.out.println("Zeichen: " + c); // Jedes Zeichen auf die Konsole schreiben.
}
List<Character> charlist = new ArrayList<Character>(); // neue Zeichen-Liste anlegen
charlist.add('a'); // Werte hinzufügen (mit Autoboxing)
charlist.add('b');
charlist.add('c');
for (Character c : charlist) {
System.out.println("Zeichen: " + c); // Jedes Zeichen auf die Konsole schreiben.
}
Výrazy
Na rozdíl od jiných programovacích jazyků, jako je například C , je pořadí, ve kterém jsou výrazy vyhodnocovány v Javě, již nastaveno v definici jazyka: operátory binárního infixu stejné úrovně, které nejsou operátory přiřazení, jsou vždy vyhodnocovány zleva doprava. Stejně jako v C lze vyhodnocení logických výrazů zkrátit, pokud již byl výsledek určen. V následujícím příkladu je zaručeno, že nejprve zkontrolujete, zda „ objekt“ není „ null“. Pokud je tento podvýraz nepravdivý ( objekttj. Je to nulová reference), pravý operand &&se vůbec nevyhodnocuje, tj. H. metoda inOrdnung()není hledána nebo dokonce volána. Celkový výraz je tedy bezpečný a nikdy nemůže způsobit „ NullPointerException“. ( NullPointerExceptionPři pokusu o nullvyřešení odkazu na objekt je v Javě vždy použit znak „ “.)
if (objekt != null && objekt.inOrdnung()) {
System.out.println("in Ordnung");
}
else {
System.out.println("ungeprüft oder Prüfung misslungen");
}
Pokud jsou bitové operátory a jsou použity místo logických operátorů &&a , musí být oba dílčí výsledky spojeny bit po bitu a zpracování se nemůže přerušit s výrazem vlevo, pokud je. Pokud má proměnná hodnotu , pokusí se virtuální počítač Java propojit hodnotu pocházející z prvního výrazu s výsledkem druhého výrazu bit po bitu. Chcete-li vypočítat druhý výraz, pokusí se virtuální počítač dereference a hodí jeden .
||&|falseobjektnullfalseobjektNullPointerException
Funkční rozhraní a výrazy lambda
Výraz lambda je bezejmenná (anonymní) metoda, kterou lze předat (jako objekt). Lambda výrazy proto popisují funkční objekty. Termín sahá až do lambda kalkulu , formálního jazyka pro vyšetřování funkcí (viz také funkční programování ). Výrazy lambda v jazyce Java existují již od prostředí Java 8 a zahrnují seznamy parametrů, návratový typ a tělo:
(<Datentyp> <Variablenbezeichner>,...,<Datentyp> <Variablenbezeichner>) -> <Anweisungsblock>
(<Datentyp> <Variablenbezeichner>,...,<Datentyp> <Variablenbezeichner>) -> <Ausdruck>
(<Variablenbezeichner>,...,<Variablenbezeichner>) -> <Anweisungsblock>
(<Variablenbezeichner>,...,<Variablenbezeichner>) -> <Ausdruck>
Kulaté závorky lze vynechat, pokud je počet obsažených prvků přesně jeden. Specifikace typů parametrů je nutná, pouze pokud ji kompilátor nemůže sám odvodit z kontextu výrazu. Funkce, která vrací součet dvou argumentů, lze vyjádřit takto:
(i,j) -> i+j
Sami nemají konkrétní typ, a proto je lze použít pouze v kontextu, který určuje typ, jako jsou volání metod, návratové příkazy a inicializace proměnných. Zadaný typ musí být funkční rozhraní. V následujícím příkladu je Comparator<String>objekt definován pomocí výrazu lambda. Tyto sortúčinky zavolat na třídění someStringspodle jejich délky, v sestupném pořadí.
List<String> someStrings = ...
Collections.sort(someStrings, (x,y) -> y.length() - x.length());
Lambda výrazy pomáhají vyhnout se často obtížně čitelným, dlouhým deklaracím vnitřních, anonymních tříd.
V Javě se rozhraní, která mají pouze jednu operaci (abstraktní metoda), nazývají funkční rozhraní . Abstraktní třída pouze s abstraktní metodou však není jako funkční rozhraní.
Odkazy na metody také představují možnost implementovat funkční rozhraní od Java 8 a dále. Máte jednu z forem
<Klassenreferenz>::<Methodenbezeichner>
<Ausdruck>::<Methodenbezeichner>
V následujícím kódu je odkaz na metodu použit System.out::printlnjako java.util.function.Consumer<String>objekt.
static <A> Consumer<A> doTwice(Consumer<A> consumer) {
return a -> {
consumer.accept(a);
consumer.accept(a);
};
}
static void foo() {
doTwice(System.out::println).accept("Hello");
}
Komentáře
Komentáře jsou části zdrojového kódu, které obsahují informace pro lidského čtenáře a jsou počítačem během dalšího zpracování ignorovány.
Rozlišují se řádkové komentáře a blokové komentáře. Komentář k řádku následuje po řádku. Syntaxe se skládá z dvojitého lomítka. Blokový komentář obsahuje popis několika řádků. Syntaxe pro toto se skládá z lomítka následovaného mal symbolem. Komentář je uzavřen značkou a lomítkem. Kompilátor při kompilaci ignoruje komentáře.
Příklad:
int i = 10; // Zeilenkommentar: hier bekommt die Variable i den Wert 10 zugewiesen.
int j = 0;
/* Blockkommentar: hier beginnt eine While-Schleife
....
j wird um Eins erhöht, solange j kleiner i ist.*/
while (j < i) {
j++;
}
Systém Javadoc se často používá k dokumentaci celých metod nebo tříd .
Generické programování
S verzí 5 Javy byl představen jazykový prvek generického programování.
webové odkazy
- Syntaxe Java . Různé tabulky syntaxe Java (německy)
Individuální důkazy
- ↑ Scott Stanchfield: Java je Pass-by-Value, sakra! JavaDude.com, přístup 5. listopadu 2010 .
- ↑ Typy, hodnoty a proměnné. (Již není k dispozici online.) V: Specifikace jazyka Java. Oracle (Sun), archivovány od originálu 9. března 2012 ; zpřístupněno 6. listopadu 2010 (anglicky). Info: Odkaz na archiv byl vložen automaticky a ještě nebyl zkontrolován. Zkontrolujte prosím původní a archivovaný odkaz podle pokynů a poté toto oznámení odstraňte.
- ↑ Martin Gerlach: Java SE 8 Innovations (Part 1): Lambda expressions and default methods In: Neo Tech Blog (vytvořeno 17. listopadu 2014, zpřístupněno 16. prosince 2016).