Java-applikationer behandler data ved at evaluere udtryk, som er kombinationer af bogstaver, metodeopkald, variabelnavne og operatorer. Evaluering af et udtryk producerer typisk en ny værdi, som kan gemmes i en variabel, bruges til at træffe en beslutning osv.
I denne vejledning lærer du, hvordan du skriver udtryk til dine Java-programmer. I mange tilfælde bruger du operatører til at skrive dine Java-udtryk, og der er mange typer af operatører at vide, hvordan man bruger. Jeg vil kort introducere Java's operatortyper (inklusive additiver, bitvise, logiske, betingede, shift- og lighedstyper) og deres operander. Du lærer også om vigtige begreber som overbelastning af operatører og operatørprioritet, og du vil se en demonstration af konvertering af primitiv type. Jeg afslutter med et lille Java-program, som du kan bruge til at øve konverteringer af primitiv type alene.
download Hent koden Download kildekoden for eksempel applikationer i denne vejledning. Oprettet af Jeff Friesen til JavaWorld.Enkle udtryk
EN simpelt udtryk er et bogstaveligt, variabelt navn eller metodeopkald. Ingen operatører er involveret. Her er nogle eksempler på enkle udtryk:
52 // heltal bogstavelig alder // variabelnavn System.out.println ("ABC"); // metodeopkald "Java" // strenge bogstavelig 98.6D // dobbelt præcision flydende-bogstavelig 89L // lang heltal bogstavelig
Et simpelt udtryk har en type, som enten er en primitiv type eller en referencetype. I disse eksempler 52
er et 32-bit heltal (int
); System.out.println ("ABC");
er ugyldig (ugyldig
) fordi den ikke returnerer nogen værdi;"Java"
er en streng (Snor
); 98.6D
er en 64-bit dobbelt præcision floating-point værdi (dobbelt
); og 89L
er et 64-bit langt heltal (lang
). Vi ved det ikke alder
's type.
Eksperimenterer med jshell
Du kan nemt prøve disse og andre enkle udtryk ved hjælp af jshell
. Indtast f.eks 52
ved jshell>
prompt, og du modtager noget i retning af følgende output:
$1 ==> 52
$1
er navnet på en ridse variabel at jshell
skaber for at gemme 52
. (Skrabevariabler oprettes, hver gang der indtastes bogstaver.) Udfør System.out.println ($ 1)
og du vil se 52
som output.
Du kan løbe jshell
med -v
kommandolinjeargument (jshell -v
) for at generere detaljeret feedback. I dette tilfælde ind 52
ville resultere i følgende meddelelse, der afslører denne variabel i bunden $1
har int
(32-bit heltal) type:
| oprettet scratch variabel $ 1: int
Prøv derefter at komme ind alder
. I dette tilfælde modtager du sandsynligvis en fejlmeddelelse om, at symbolet ikke blev fundet. Java Shell antager det alder
er en variabel, men den ved ikke dens type. Du bliver nødt til at medtage en type; se for eksempel hvad der sker, hvis du går ind int alder
.
Sammensatte udtryk
EN sammensat ekspression består af et eller flere enkle udtryk integreret i et større udtryk via en operatør, som er en sekvens af instruktioner symbolsk repræsenteret i kildekoden. Operatøren forvandler sit udtryk operand (er) ind i en anden værdi. For eksempel i 6 * 5
, multiplikationsoperatoren (*
) transformerer operander 6
og 5
ind i 30.
Sammensatte udtryk kan kombineres til større udtryk. For eksempel, 6 * 5 + 10
præsenterer sammensat ekspression 6 * 5
og et sammensat udtryk bestående af deres produkt, additionsoperator +
og nummeret 10
. Evalueringsrækkefølgen (gang først og derefter tilføj) dikteres af Java'er forrangsregel, som vi snart kommer til.
Sammensatte udtryk kan også være enkle
6 * 5
er en sammensat ekspression, der består af to enkle udtryk, 6
og 5
. Men 6 * 5
er også et simpelt udtryk fra +
's perspektiv. Det +
operatøren ser kun deres produkt, 30, hvilket er et simpelt udtryk.
Operatører og operander
Java's operatører er klassificeret efter deres antal operander:
- EN unary operatør har f.eks. en operand unary minus (f.eks.,
-5
). - EN binær operatør har to operander, eksempler er multiplikation og addition.
- EN ternær operatør har tre operander; et eksempel er betinget operatør (
?:
).
Java's operatører er også klassificeret efter position:
- EN præfiksoperatør er en unary operatør, der går forud for sin operand (f.eks.
-5
). - EN postfix-operatør er en unary operatør, der følger sin operand (f.eks.
alder ++;
- tilføj 1 tilalder
's numeriske værdi). - En infix-operatør er en binær eller ternær operator mellem operatørens operander (f.eks.
alder + 5
).
Et andet jshell-eksempel
Jeg introducerer flere operatører i de følgende afsnit, hvor jeg præsenterer eksempler i form af applikationer. Du kan også prøve disse operatører med jshell
, ligesom:
jshell> 6 + 2 $ 1 ==> 8 jshell> 7 * $ 1 $ 2 ==> 56
I dette tilfælde indtaster vi først udtryk 6 + 2
, hvilken jshell
evaluerer ved at tildele den resulterende 8 til ridse-variabel $1
. Derefter multiplicerer vi $1
ved 7
, der gemmer 56 i scratch variabel $2
. Dette eksempel viser, at du kan bruge skrapevariabler i Java-udtryk.
Overbelastede operatører
Plus (+) operatoren er et eksempel på en overbelastet operatør, som er en operatør, der udfører en af flere operationer baseret på typer af dets operander. Plusoperatoren udfører tilføjelse af heltal, når begge operander er heltal, flydende punktaddition, når begge operander er flydende punktværdier, og strengkoncentration, når begge operander er strenge. Minus (-) operatoren er også overbelastet og udfører heltal eller floating-point subtraktion.
Operatortyper i Java
Additive operatører
Det additivoperatorer øge eller formindske en numerisk værdi gennem addition og subtraktion. Additive operatorer inkluderer addition (+
), subtraktion (-
), postdecrement (--
), postinkrement (++
), forkølelse (--
) og forhøjelse (++
). Sammenkædning af streng (+
) betragtes også som additiv. Her er en formel definition for hver af disse operatører:
- Tilføjelse: Givet
operand1 + operand2
, hvor hver operand skal være af karakter eller numerisk type, tilføjoperand2
tiloperand1
og returner summen. Eksempel:4 + 6
. - Subtraktion: Givet
operand1 - operand2
, hvor hver operand skal være af karakter eller numerisk type, trækkes fraoperand2
fraoperand1
og returner forskellen. Eksempel:4 - 6
. - Postdecrement: Givet
variabel--
, hvorvariabel
skal være af karakter eller numerisk type, trække 1 fravariabel
værdi (lagring af resultatet ivariabel
) og returner den oprindelige værdi. Eksempel:x--;
. - Postforøgelse: Givet
variabel++
, hvorvariabel
skal være af karakter eller numerisk type, tilføj 1 tilvariabel
værdi (lagring af resultatet ivariabel
) og returner den oprindelige værdi. Eksempel:x ++;
. - Predecrement: Givet
--variabel
, hvorvariabel
skal være af karakter eller numerisk type, trække 1 fra dens værdi, gemme resultatet ivariabel
, og returner den nye reducerede værdi. Eksempel:--x;
. - Forhøjelse: Givet
++variabel
, hvorvariabel
skal være af karakter eller numerisk type, tilføj 1 til dens værdi, gemme resultatet ivariabel
, og returner den nye forøgede værdi. Eksempel:++ x;
. - Sammenkædning af streng: Givet
operand1 + operand2
, hvor mindst en operand er afSnor
skriv, tilføjoperand2
's strengrepræsentation tiloperand1
's strengrepræsentation og returnere resultatet. Eksempel:"A" + "B"
.
Tilføjelses-, subtraktions-, postdecrement-, postincrement-, predecrement- og preincrement-operatorerne kan generere værdier, der overløber grænserne for resultattypen. For eksempel kan tilføjelse af to store positive 64-bit heltalværdier producere en værdi, der ikke kan repræsenteres i 64 bit. Det resulterende overløb detekteres eller rapporteres ikke af Java's additivoperatører.
Overløbsdetektering i Java-standardklassebiblioteket
Standard klassebiblioteket Matematik
klasse inkluderer metoder til at detektere overløb. For eksempel, int addExact (int x, int y)
tilføjer værdierne i x
og y
, returnere summen eller kaste en undtagelse på overløb.
Eksempel på anvendelse: Additive operatorer
Listing 1 præsenterer et lille program til at spille med Java's additive operatorer.
Liste 1. Tilsætningsoperatorer i Java (AddOp.java)
klasse AddOp {public static void main (String [] args) {System.out.println (125 + 463); System.out.println (2.0 - 6.3); int alder = 65; System.out.println (alder); System.out.println (alder--); System.out.println (alder ++); System.out.println (- alder); System.out.println (++ alder); System.out.println ("A" + "B"); }}
Du lærte i den foregående vejledning, hvordan du bruger JDK'er javac
værktøj til at kompilere Java kildekode og java
værktøj til at køre den resulterende applikation. Udfør følgende kommando for at kompilere liste 1:
javac AddOp.java
Under forudsætning af vellykket kompilering skal du observere en AddOp.klasse
fil i det aktuelle bibliotek. Udfør følgende kommando for at køre den:
java AddOp
TilføjOp
svarer ved at producere følgende output:
588 -4,3 65 65 64 64 65 AB
At studere dette output giver indsigt i postincrement-, postdecrement-, preincrement- og predecrement-operatørerne. Til postinkrement / postdecrement, alder
's aktuelle værdi sendes ud før trinvise / mindskede operationer. Ved forforøgelse / forudgående udførelse udføres operationen, og resultatet lagres i alder
, og så alder
den nye værdi udgives.
Iterering med Java-operatører
Additivoperatorerne er især nyttige i forbindelse med en iterationserklæring, hvor de bruges til at gå videre til næste iteration. Du lærer om iterationserklæringer i den næste Java 101-vejledning.
Matrixindeksoperator
Det matrixindeksoperatør ([]
) får adgang til et array-element ved at tilvejebringe elementets indeks (position). Denne operator placeres efter arrayvariabelens navn, som i karakterer [0]
(få adgang til det første element i det array, der er tildelt karakterer
; det første element er gemt i indeks 0). Her er en formel definition:
Givet variabel[indeks]
, hvor indeks
skal være af heltal (int
) type, læse en værdi fra eller gemme en værdi i variabel
's opbevaringselement på stedet indeks
. Eksempel: temperaturer [1]
Værdien videregivet til indeks
er et 32-bit heltal, der enten er 0 eller en positiv værdi, der spænder til en mindre end arrayets længde, hvilket er angivet ved at tilføje .længde
til arrayets navn. For eksempel, karakterer. længde
returnerer antallet af elementer i det array, der er tildelt karakterer
.
Array variabler vs arrays
karakterer
er ikke en matrix, men er en variabel, der indeholder en henvisning til et hukommelsesområde, der danner arrayet. Dette gælder for alle Java-arrays. Det er dog konventionelt at henvise til karakterer
eller en hvilken som helst matrixvariabel som en matrix.
Eksempel på anvendelse: Array index operator
Liste 2 viser kildekoden til et eksempel på et program, der giver dig mulighed for at spille med array-indeksoperatøren.
Liste 2. Array-indeksoperator i Java (ArrayIndexOp.java)
klasse ArrayIndexOp {public static void main (String [] args) {int [] ratings = {89, 90, 68, 73, 79}; System.out.println (karakterer [1]); karakterer [1] = 91; System.out.println (karakterer [1]); int-indeks = 4; System.out.println (karakterer [indeks]); System.out.println (karakterer ['C' - 'A']); // System.out.println (karakterer [1D]); }}
Listing 2 er noget mere interessant end Listing 1. Efter at have oprettet et fem-element, en-dimensionelt array af heltal (via en array initialisering) og tildelt arrayets reference til karakterer
, hoved ()
fortsætter med at få adgang til forskellige elementer. To ting er af særlig interesse:
- Arrayindeksoperatørens indeks skal i sidste ende være et 32-bit heltal (0 eller en positiv værdi). Du kan angive navnet på en heltalsvariabel (f.eks.
indeks
), som indeholder indeksværdien, som indeks. - Du kan angive en beregning, der involverer bogstaver. (Senere i denne vejledning introducerer jeg typekonverteringer, og du finder ud af hvorfor
'C' - 'A'
producerer et heltal (2), der fungerer som et gyldigt indeks.)
Det sidste eksempel, der passerer 1D
som et indeks til arrayindeksoperatøren, kommenteres, fordi det ikke kompileres. Hvis du ikke kommenterer linjen og forsøger at kompilere Listing 2, vil du modtage en fejlmeddelelse om inkompatible typer: "mulig lossy konvertering fra dobbelt
til int.
."
Kompilere lister 2 (javac ArrayIndexOp.java
) og kør applikationen (java ArrayIndexOp
). Du skal overholde følgende output:
90 91 79 68
Arrayindeksoperatoren og flerdimensionelle arrays
Du kan bruge denne operator med flerdimensionelle arrays. For eksempel under forudsætning af en todimensional omkostninger
matrix, omkostninger [0] [1]
adgang til det element, der er tildelt den første række (via [0]
) og den anden kolonne (via [1]
).
Opgaveoperatører
Det opgaveoperatør (=
) tildeler et udtryks værdi til en variabel (f.eks. i = 6;
), inklusive et array-element (f.eks. x [0] = 15;
). Udtrykket og variablen skal være opgave kompatibel, hvilket betyder, at deres typer skal være enige. For eksempel kan du ikke tildele en strengliteral til en heltalsvariabel. Jeg forklarer mere om dette, når vi diskuterer typekonverteringer.
Sammensatte tildelingsoperatører (+=
, -=
, *=
, /=
, %=
, &=
, |=
, ^=
, <<=
, >>=
, >>>=
) evaluere udtryk og tildele resultaterne til variabler i et trin. Hvert udtryk og variabel skal være tildelingskompatibel. Hver operatør fungerer som en nyttig genvej. For eksempel i stedet for at specificere x = x + 3;
, kan du angive det kortere og tilsvarende x + = 3;
.
Hold det kort!
I stedet for at specificere x = x + 1;
eller x = x - 1;
, kan du angive den kortere x + = 1;
eller x - = 1;
. Du kan spare endnu mere tastetryk ved at angive den kortere x ++;
eller x--;
.