Java Language
Uitdrukkingen
Zoeken…
Invoering
Opmerkingen
Zie Operators voor een referentie over de operatoren die in uitdrukkingen kunnen worden gebruikt.
Voorrang operator
Wanneer een uitdrukking meerdere operatoren bevat, kan deze mogelijk op verschillende manieren worden gelezen. De wiskundige uitdrukking 1 + 2 x 3
kan bijvoorbeeld op twee manieren worden gelezen:
- Voeg
1
en2
en vermenigvuldig het resultaat met3
. Dit geeft het antwoord9
. Als we haakjes toevoegen, ziet dit eruit als( 1 + 2 ) x 3
. - Voeg
1
aan het resultaat van vermenigvuldiging2
en3
. Dit geeft het antwoord7
. Als we haakjes toevoegen, ziet dit eruit als1 + ( 2 x 3 )
.
In de wiskunde is de conventie de uitdrukking op de tweede manier te lezen. De algemene regel is dat vermenigvuldiging en deling plaatsvinden vóór optellen en aftrekken. Wanneer meer geavanceerde wiskundige notatie wordt gebruikt, is de betekenis ofwel "vanzelfsprekend" (voor een getrainde wiskundige!), Of worden haakjes toegevoegd om het ondubbelzinnig te maken. In beide gevallen hangt de effectiviteit van de notatie om betekenis over te brengen af van de intelligentie en gedeelde kennis van de wiskundigen.
Java heeft dezelfde duidelijke regels voor het lezen van een uitdrukking, gebaseerd op de prioriteit van de operatoren die worden gebruikt.
In het algemeen wordt aan elke operator een prioriteitswaarde toegekend; zie onderstaande tabel.
Bijvoorbeeld:
1 + 2 * 3
De prioriteit van +
is lager dan de prioriteit van *
, dus het resultaat van de uitdrukking is 7, niet 9.
Beschrijving | Operators / constructen (primair) | Voorrang | associativiteit |
---|---|---|---|
qualifier haakjes Aanmaak van exemplaren Toegang tot het veld Array toegang Aanroep van methode Methode referentie | naam . naam ( expr ) new primair . naam primaire [ expr ] primair ( expr, ... ) primaire :: naam | 15 | Van links naar rechts |
Verhogen post | expr ++ , expr -- | 14 | - |
Pre increment unaire Cast 1 | ++ expr, -- expr, + Expr, - expr, ~ expr, ! expr, ( type ) expr | 13 | - Rechts naar links Rechts naar links |
multiplicatieve | * /% | 12 | Van links naar rechts |
toevoeging | + - | 11 | Van links naar rechts |
Verschuiving | << >> >>> | 10 | Van links naar rechts |
relationele | <> <=> = instanceof | 9 | Van links naar rechts |
Gelijkheid | ==! = | 8 | Van links naar rechts |
Bitwise AND | & | 7 | Van links naar rechts |
Bitwise exclusief OF | ^ | 6 | Van links naar rechts |
Bitgewijs inclusief OF | | | 5 | Van links naar rechts |
Logisch EN | && | 4 | Van links naar rechts |
Logisch OF | || | 3 | Van links naar rechts |
Voorwaardelijk 1 | ? : | 2 | Rechts naar links |
toewijzing Lambda 1 | = * = / =% = + = - = << = >> = >>> = & = ^ = | = -> | 1 | Rechts naar links |
1 Prioriteit van Lambda-expressie is complex, omdat het ook kan optreden na een cast of als het derde deel van de voorwaardelijke ternaire operator.
Constante uitdrukkingen
Een constante expressie is een expressie die een primitief type of een tekenreeks oplevert en waarvan de waarde tijdens het compileren tot een letterlijke waarde kan worden geëvalueerd. De uitdrukking moet worden geëvalueerd zonder een uitzondering te maken en moet alleen uit het volgende bestaan:
Primitieve en String literals.
Type cast naar primitieve typen of
String
.De volgende unaire operatoren:
+
,-
,~
en!
.De volgende binaire operatoren:
*
,/
,%
,+
,-
,<<
,>>
,>>>
,<
,<=
,>
,>=
,==
!=
,&
,^
,|
,&&
en||
.De ternaire voorwaardelijke operator
?
:
.Haakjes constante uitdrukkingen.
Eenvoudige namen die verwijzen naar constante variabelen. (Een constante variabele is een variabele die als
final
aangegeven, waarbij de initialisatie-uitdrukking zelf een constante uitdrukking is.)Gekwalificeerde namen van het formulier
<TypeName> . <Identifier>
die verwijzen naar constante variabelen.
Merk op dat de bovenstaande lijst ++
en --
, de toewijzingsoperators, class
en instanceof
, methodeaanroepen en verwijzingen naar algemene variabelen of velden uitsluit .
Constante expressies van het type String
resulteren in een "geïnterneerde" String
en drijvende-kommabewerkingen in constante expressies worden geëvalueerd met FP-strikte semantiek.
Gebruikt voor constante uitdrukkingen
Constante expressies kunnen overal worden gebruikt waar een normale expressie kan worden gebruikt. Ze hebben echter een speciale betekenis in de volgende contexten.
Constante uitdrukkingen zijn vereist voor hoofdetiketten in schakelinstructies. Bijvoorbeeld:
switch (someValue) {
case 1 + 1: // OK
case Math.min(2, 3): // Error - not a constant expression
doSomething();
}
Als de uitdrukking aan de rechterkant van een toewijzing een constante uitdrukking is, kan de toewijzing een primitieve vernauwing omzetten. Dit is toegestaan op voorwaarde dat de waarde van de constante uitdrukking binnen het bereik van het type aan de linkerkant ligt. (Zie JLS 5.1.3 en 5.2 ) Bijvoorbeeld:
byte b1 = 1 + 1; // OK - primitive narrowing conversion.
byte b2 = 127 + 1; // Error - out of range
byte b3 = b1 + 1; // Error - not a constant expession
byte b4 = (byte) (b1 + 1); // OK
Wanneer een constante uitdrukking wordt gebruikt als de voorwaarde in een do
, while
of for
, dan beïnvloedt dit de leesbaarheidsanalyse. Bijvoorbeeld:
while (false) {
doSomething(); // Error - statenent not reachable
}
boolean flag = false;
while (flag) {
doSomething(); // OK
}
(Merk op dat dit niet van toepassing is op if
instructies. De Java-compiler staat het then
of else
blok van een if
instructie toe onbereikbaar te zijn. Dit is het Java-analoog van voorwaardelijke compilatie in C en C ++.)
Ten slotte worden static final
velden in een klasse of interface met initialisatie van constante expressie enthousiast geïnitialiseerd. Het is dus gegarandeerd dat deze constanten worden waargenomen in de geïnitialiseerde status, zelfs wanneer er een cyclus is in de grafiek voor de initialisatie van de klasse-initialisatie.
Raadpleeg JLS 15.28 voor meer informatie . Constante uitdrukkingen .
Order voor expressie-evaluatie
Java-expressies worden geëvalueerd volgens de volgende regels:
- Operanden worden van links naar rechts geëvalueerd.
- De operanden van een operator worden vóór de operator geëvalueerd.
- Operators worden geëvalueerd volgens operatorprioriteit
- Argumentenlijsten worden van links naar rechts geëvalueerd.
Eenvoudig voorbeeld
In het volgende voorbeeld:
int i = method1() + method2();
de volgorde van evaluatie is:
- De linker operand van
=
operator wordt geëvalueerd naar het adres vani
. - De
method1()
van de operator+
(method1()
) wordt geëvalueerd. - De juiste operand van de operator
+
(method2()
) wordt geëvalueerd. - De bewerking
+
wordt geëvalueerd. - De bewerking
=
wordt geëvalueerd, waarbij het resultaat van de toevoeging wordt toegewezen aani
.
Merk op dat als de effecten van de aanroepen waarneembaar zijn, u zult kunnen waarnemen dat de aanroep van method1
plaatsvindt vóór de aanroep van method2
.
Voorbeeld met een operator die een bijwerking heeft
In het volgende voorbeeld:
int i = 1;
intArray[i] = ++i + 1;
de volgorde van evaluatie is:
- De linker operand van
=
operator wordt geëvalueerd. Dit geeft het adres vanintArray[1]
. - De pre-toename wordt geëvalueerd. Dit voegt
1
aani
en resulteert in2
. - De rechterhand operand van de
+
wordt geëvalueerd. - De bewerking
+
wordt geëvalueerd als:2 + 1
->3
. - De
=
bewerking wordt geëvalueerd, waarbij3
wordt toegewezen aanintArray[1]
.
Merk op dat aangezien de linker operand van de =
eerst wordt geëvalueerd, deze niet wordt beïnvloed door de bijwerking van de ++i
subexpressie.
Referentie:
Basisprincipes van expressie
Uitdrukkingen in Java zijn de primaire constructie voor het uitvoeren van berekeningen. Hier zijn enkele voorbeelden:
1 // A simple literal is an expression
1 + 2 // A simple expression that adds two numbers
(i + j) / k // An expression with multiple operations
(flag) ? c : d // An expression using the "conditional" operator
(String) s // A type-cast is an expression
obj.test() // A method call is an expression
new Object() // Creation of an object is an expression
new int[] // Creation of an object is an expression
Over het algemeen bestaat een uitdrukking uit de volgende vormen:
- Uitdrukkingsnamen die bestaan uit:
- Eenvoudige identificatiegegevens; bijvoorbeeld
someIdentifier
- Gekwalificeerde identificatiegegevens; bijv.
MyClass.someField
- Eenvoudige identificatiegegevens; bijvoorbeeld
- Primaries die bestaan uit:
- literals; bijv.
1
,1.0
,'X'
,"hello"
,false
ennull
- Klasse letterlijke uitdrukkingen; bijv.
MyClass.class
-
this
en<TypeName> . this
- Haakjes uitdrukkingen; bijv.
( a + b )
- Klasse-instantie uitdrukkingen; bijv.
new MyClass(1, 2, 3)
- Uitdrukkingen voor het maken van arrayinstanties; bijv.
new int[3]
- Veldtoegangsuitdrukkingen; bijv.
obj.someField
ofthis.someField
- Matrix toegangsuitdrukkingen; bijv.
vector[21]
- Aanroepingen van methoden; bijv.
obj.doIt(1, 2, 3)
- Referentiemethoden (Java 8 en hoger); bijv.
MyClass::doIt
- literals; bijv.
- Unaire operatoruitdrukkingen; bijvoorbeeld
!a
ofi++
- Binaire operator uitdrukkingen; bijv.
a + b
ofobj == null
- Ternary operator expressies; bijv.
(obj == null) ? 1 : obj.getCount()
- Lambda-uitdrukkingen (Java 8 en hoger); bijv.
obj -> obj.getCount()
De details van de verschillende uitdrukkingsvormen zijn te vinden in andere onderwerpen.
- Het onderwerp Operators heeft betrekking op unaire, binaire en ternaire operatoruitdrukkingen.
- Het onderwerp Lambda-uitdrukkingen heeft betrekking op lambda-uitdrukkingen en uitdrukkingen voor methodeverwijzingen.
- Het onderwerp Klassen en objecten behandelt uitdrukkingen voor het maken van klasseninstanties.
- Het onderwerp Arrays heeft betrekking op matrixtoegangsuitdrukkingen en expressies voor het maken van matrixinstanties.
- Het onderwerp Letterlijk behandelt de verschillende soorten letterlijke uitdrukkingen.
Het type expressie
In de meeste gevallen heeft een uitdrukking een statisch type dat kan worden bepaald tijdens het compileren door te onderzoeken en de subexpressies ervan. Dit worden op zichzelf staande uitdrukkingen genoemd.
(In Java 8 en hoger) kunnen de volgende soorten expressies echter poly-expressies zijn :
- Haakjes uitdrukkingen
- Klasse-instantie creatie-expressies
- Methode aanroep uitdrukkingen
- Methode referentie uitdrukkingen
- Voorwaardelijke uitdrukkingen
- Lambda-uitdrukkingen
Als een expressie een poly uitdrukking, kan het type worden beïnvloed door de expressie van doeltype; dat wil zeggen waarvoor het wordt gebruikt.
De waarde van een expressie
De waarde van een uitdrukking is toewijzing compatibel met het type. De uitzondering hierop is wanneer hoop op vervuiling is opgetreden; bijv. omdat waarschuwingen voor "onveilige conversie" (ten onrechte) zijn onderdrukt of genegeerd.
Expressie verklaringen
In tegenstelling tot veel andere talen, staat Java over het algemeen niet toe dat uitdrukkingen als verklaringen worden gebruikt. Bijvoorbeeld:
public void compute(int i, int j) {
i + j; // ERROR
}
Omdat het resultaat van het evalueren van een uitdrukking als niet kan worden gebruikt, en omdat het de uitvoering van het programma op geen enkele andere manier kan beïnvloeden, hebben de Java-ontwerpers het standpunt ingenomen dat een dergelijk gebruik ofwel een fout is, ofwel verkeerd is.
Dit geldt echter niet voor alle uitdrukkingen. Een subset van uitdrukkingen zijn (in feite) legaal als verklaringen. De set bestaat uit:
- Opdrachtuitdrukking, inclusief bewerking-en-wordt- opdrachten.
- Pre- en post-increment- en decrement-expressies.
- Methodeaanroepen (
void
ofvoid
). - Klasse-instantie uitdrukkingen.