第3章
- 演算子と優先順位
- データの比較
- 基本データ型の型変換
- 基本データ型から参照型への型変換
- ifによる分岐
- switchによる分岐
演算子と優先順位
+や=などの記号を演算子という
演算子には優先順位がある
算術演算子と炭鉱演算子
算術演算子は基本的な計算に使う演算子、演算の対象になる値や変数をオペランドという
+(足す), -(引く), *(掛ける), /(割る), %(剰余), ++(インクリメント), --(デクリメント)
代入演算子と複合代入演算子
= (代入演算子)
複合代入演算子は、算術演算子と代入演算子をあわせたもの。
a += b -> a = a + bのように算術演算子の結果を代入する。
関係演算子
2つの値の比較に使う。結果はbooleanで返ってくる
==(等しい), !=(等しくない), >(より大きい), >=(以上), <(より小さい), <=(以下)
論理演算子
2つの条件を評価し、結果をbooleanで返す
複数の条件判定が可能になる
&(AND), &&(AND), |(OR), ||(OR), ^(XOR), !(NOT)
&と&&、|と||の違いは、&, |はオペランド全体を評価するのに対し、&&, ||は1つ目のオペランドで結果が確定する場合2つ目を評価しない
(これをショートサーキットと呼ぶ)
条件演算子
条件式 ? 式1 : 式2
条件演算子は条件によって異なる式を実行する。三項演算子などとも呼ばれる
条件式には結果がbooleanとなる式を指定し、結果がtrueなら式1、falseなら式2が実行される
データの比較
==と!=は参照型にも使用できる。
==は参照型に使うときは、参照先が等しいかを比較する(同一性)
Stringクラスでの文字列の比較
文字列が等しいか(同値性)を比較する場合、equals()メソッドを使用する
その他にもいくつかの特徴がある
- newしなくてもオブジェクト生成ができる
- newせずに生成した文字列は使い回される(コンスタントプール)、
intern()メソッドでも可能
intern()メソッド : コンスタントプールに同じ文字列がある場合はそれを返す、なかった場合はコンスタントプールに追加してから参照を返す
StringBuilderクラスはequalsメソッドが使えないのでtoStringしてから比較する
基本データ型の型変換
byte -> short -> int -> long -> float -> double ->...
右矢印の方向には暗黙的に型変換してくれる(ワイドニング)
逆向きは値が変わることがあるため、明示的な型変換が必要(ナローイング)
キャスト式
(変換したいデータ型) 変数やリテラル
また、booleanを除く基本データ型はchar型に変換できる。(¥u0000から¥uffffまでのunicode文字として解釈される)
基本データ型から参照型への型変換
基本データ型を参照型として扱うクラス(ラッパークラス)が用意されている。
ラッパークラス名は基本データ型の頭文字を大文字にしたものByteなど
変換は自動で行われる(オート(アン)ボクシング)ため、キャストのような仕組みはない
文字列の変換
- 文字列から基本データ型への変換
ラッパークラス名.parseXxx(文字列)
int i = Integer.parseInt("123") // 文字列からint - 文字列の1文字をcharに変換
文字列.charAt(インデックス)
char c = "Duke".charAt(0) // 文字列のー番目(D)をcharに
ifによる分岐
if文
if(条件式){
条件がtrueの場合の処理;
}
{}を省略して書くこともできる。その場合はif文直後の1文だけがif文の処理になる
if-else文
if(条件式){
trueの場合の処理;
}else{
falseの場合の処理;
}
falseの場合の処理をelseブロックに書く。複数記述でき、{}を省略すると直後の1文のみとなる
if-else if文
if(条件式1){
条件式1がtrueの場合の処理;
}else if(条件式2){
条件式2がtrueの場合の処理;
}else{
すべての条件がfalseの場合の処理;
}
if文のネスト
if(){
if(){
}
}else{
}
また、equalsメソッドや論理演算子を使ってtrueの場合の処理をしたりすることもできる。
switchによる分岐
if文の他にswitch文でも分岐構造を実現できる
switch(式){
case 定数1:
式の評価結果が定数1に一致する場合の処理1;
break; // switch文のブロックを抜ける記述、書き忘れると以下の処理が全て実行される
case 定数2,3:
式の評価結果が定数2か3に一致する場合の処理2;
break;
default:
一致する評価がない場合の処理;// 省略可
}
式にはbyte, short, int, char, Stringのほかに
列挙型(enum)や↑のラッパークラスが入る
:の代わりに->を使う方法がある、一致するcaseのみが実行されるのでbreak書き忘れなどによる意図しない実行が防げる
switch(式){
case 定数 -> 式/ブロック/例外のスロー
default -> 式/ブロック/例外のスロー
}
switch式
switchを式として扱う
int month = 12;
Srstem.out.println(
switch(month){
// case 定数 : 処理 yield 戻す値;
case 12,1,2 : yield "Winter";
// case 定数 -> 処理 戻す値;
case 12,1,2 -> "Winter"
default yield "N/A"
// default必須(返り値が必要なため)
}
);
「3章の8つの引っ掛けポイント」
- 小数点 = doubleデフォ (f サフィックス)
- 文字列連結 = + のみ
- String/StringBuilder比較 = toString()必須
- ショートサーキット = && と &
- NOT反転 = !で条件反転
- if-else if = 順序大事
- switch case = final定数のみ
- switch型 = long/boolean不可