演算子の基本と優先順位
変数の宣言と初期化が完了したら、次はデータを変形・処理する手段が必要となります。この役割を果たすのが 演算子 です。演算子は特殊な記号であり、ひとつまたは複数のオペランド(操作対象)に対して特定の計算や比較を実行し、結果を返します。
複雑な式を展開する際、演算子の評価順序(優先順位)を理解しておくことが不可欠です。以下の表は、最も評価される順に並べた Java の演算子一覧です。上部にある演算子は優先度が高く、下部ほど低くなります。同一優先度の演算子が連続する場合、代入演算子を除き左から右へ評価されます。
| カテゴリ | 演算子 |
|---|---|
| 後置 / 単項 | expr++, expr--, ++expr, --expr, +expr, -expr, ~, ! |
| 乗除 / 余り | *, /, % |
| 加減 | +, - |
| シフト | <<, >>, >>> |
| 比較 | <, >, <=, >=, instanceof |
| 一致 | ==, != |
| ビット演算 | &, ^, | |
| 論理演算 | &&, || |
| 三項 | ? : : |
| 代入 | =, +=, -= など |
代入と算術演算子
最も基本的かつ頻繁に利用されるのは単純代入演算子の = です。右辺の値を左辺の変数に格納します。これにより、データの保持状態を管理できます。
int balance = 1000; // バランスを初期化
int transactionAmount = 50;
// ...
数値計算を行うための演算子も用意されています。四則演算に加え、割算の余りを取得する % モジュロ演算子があります。
+: 加算、文字列連結-: 減算*: 乗算/: 商の除算%: 剰余(余り)の取得
以下に、計算過程を追跡するデモを示します。
class CalculationFlow {
public static void main(String[] args) {
double currentTotal = 10.5;
currentTotal += 5.0; // 合計金額に追加
System.out.println("Step 1: " + currentTotal);
currentTotal -= 2.5; // 割引適用
System.out.println("Step 2: " + currentTotal);
double taxRate = 0.1;
double tax = currentTotal * taxRate;
System.out.println("Tax Amount: " + tax);
}
}
また、+ は数値加算以外に、文字列を連結する際にも用いられます。
String prefix = "Hello";
String suffix = " World!";
System.out.println(prefix + suffix); // "Hello World!" と表示
単項演算子
単一のオペランド作用于る演算子群です。値の更新や否定などに使用します。
++: インクリメント(1 増加)--: デクリメント(1 減少)!: 論理否定(ブール値の反転)
インクリメントには前置形式(++i)と後置形式(i++)があり、式内での評価タイミングが異なります。
class CounterExample {
public static void main(String[] args) {
int count = 5;
// 評価後に増加
int val1 = count++;
System.out.println("val1: " + val1 + ", count: " + count); // 5, 6
// 増加後に評価
int val2 = ++count;
System.out.println("val2: " + val2 + ", count: " + count); // 7, 7
}
}
相等および関係演算子
2 つの値を比較して真偽値を返す演算子です。条件分岐の基礎となります。
== | 等しい |
!= | 等しくない |
>, >=, <, <= | 大小比較 |
注意として、条件判定には必ず == を使用し、代入用の = と混同しないようにします。
class ConditionCheck {
public static void main(String[] args) {
int score = 85;
boolean isPassed = score >= 60;
if (isPassed) {
System.out.println("合格ラインを超えています");
} else {
System.out.println("不合格です");
}
}
}
条件およびビット演算子
論理演算子である &&(AND)や ||(OR)は、「ショートサーキット」動作を持ちます。つまり、最初の引数が結果を決定できる場合、二つ目の引数は評価されません。
ビット演算子は整数型の内部データを直接操作するために使用されます。&(AND), |(OR), ^(XOR), ~(NOT)などがあります。例えば、フラグ管理で特定のエラーコードだけを抽出する際などに有用です。
class BitManipulation {
public static void main(String[] args) {
int flags = 0b1010; // ビットパターン
int mask = 0b0011;
int result = flags & mask;
System.out.println(result); // AND 操作の結果
}
}
式、文、およびブロック
Java コードの基本構成要素を整理します。
式の定義
式 は、値を計算する組み立て物です。変数、演算子、メソッド呼び出しなどが含まれます。計算の順序は演算子の優先度によって決まりますが、明示的に括弧 () を使用することで意図した順序を保証できます。
// 暗黙的な優先順位
int value = x + y / 100;
// 明確にするための推奨表現
int value = (x + y) / 100;
文とブロック
文はプログラムの実行単位です。多くの場合はセミコロン ; で終わります。また、大括弧 {} で囲まれた文の集まりは「ブロック」と呼ばれ、スコープを限定したり制御構造の本体として機能します。
制御フロー文
プログラム実行の流れを制御するための仕組みです。代表的なものとして条件分岐とループがあります。
if-then および if-else
特定の条件が真の場合に実行する処理を指定します。
boolean isActive = true;
if (isActive) {
startService();
} else {
logInactiveUser();
}
switch 文
整数、文字列、または列挙型に基づいて複数の処理パスを選択できます。break 文がないと、次のケースへと「フォールスルー」してしまうため注意が必要です。
String action = "SAVE";
switch (action.toUpperCase()) {
case "CREATE":
createResource();
break;
case "UPDATE":
updateResource();
break;
default:
System.out.println("Unknown action");
}
ループ処理
for ループ
繰り返し回数が明確な場合に最適です。
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
強化された for ループ を使えばコレクションの要素を簡単に走査できます。
int[] dataPoints = {10, 20, 30};
for (int val : dataPoints) {
System.out.println(val);
}
while および do-while
条件が満たされる限りループします。do-while は少なくとも 1 回は実行される点が特徴です。
int attempt = 0;
do {
attempt++;
// ロジック...
} while (attempt < 3);
ブランチ処理
break: ループや switch から脱出。continue: 現在のイテレーションをスキップし、次へ進む。return: メソッドから即時終了し、値(任意の場合はなし)を返す。
クラスとオブジェクト
Java はオブジェクト指向プログラミング言語です。データとその振る舞いを結合させる単位としてクラスを使用します。
クラスの構成
クラスはフィールド(変数)、メソッド(関数)、コンストラクタで構成されます。
public class Product {
private String name;
private double price;
public Product(String n, double p) {
this.name = n;
this.price = p;
}
public double getPrice() {
return price;
}
}
ここで this キーワードは、パラメータ名とフィールド名が競合している場合に、クラス内のメンバを参照するために使用されます。
メソッド
メソッドはクラスにアクションをもたらすコードブロックです。署名(名前+パラメータ型リスト)によって識別されます。同名でもパラメータの種類や数が異なれば「オーバーロード」として区別可能です。
コンストラクタ
クラスから新しいインスタンスを作成する際に呼び出されます。戻り型を持たない代わりにクラス名と同じ名称を持ちます。
パラメータ伝達
基本型(int, double など)は値渡しです。メソッド内で変更されても元の値には影響しません。
一方、参照型(オブジェクトや配列)は参照渡しの挙動を示します。メソッド内でオブジェクトの内容を変更すれば反映されますが、参照先そのものを別のオブジェクトに変更しても、呼び出し元の影響は受けません。