この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:15
ページ更新者:T
更新日時:2026-06-11 07:12:00

タイトル: 文法
SEOタイトル: Java 文法の基礎完全ガイド — class / 変数 / 制御 / OOP / Generics / Lambda / record

この記事の要点
  • Java の最小単位は class。実行は public static void main(String[] args) から始まる
  • 変数は primitive (int, long, double, boolean, char ほか) と reference (オブジェクト) の 2 種類
  • OOP の核は class / instance / extends / implements。多重継承は不可、複数 interface は可
  • アクセス修飾子: public / protected / package-private / private。final は再代入禁止、static はクラス共有
  • Java 8 以降は Lambda・Stream API、Java 14+ は record、Java 17+ は sealed class / switch 式 が定番

Java の最小プログラム

Java はすべてが class に属し、エントリーポイントは public static void main(String[] args) です。

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}
// javac Hello.java   → Hello.class
// java Hello         → Hello, Java!

Java 11 以降は java Hello.javaコンパイル不要の単一ファイル実行もできます。

変数とデータ型

Java の変数は プリミティブ型参照型 に大別されます。

分類サイズ
整数byte8bit-128 〜 127
short16bit±32,767
int32bit±21 億
long64bit末尾 L: 1_000L
浮動小数float32bit末尾 F: 3.14F
double64bit標準
論理boolean1bittrue / false
文字char16bitUTF-16 1 符号単位
参照型String など4 or 8byteヒープへの参照
int    age   = 30;
long   pop   = 7_900_000_000L;   // アンダースコア区切り
double pi    = 3.14159;
char   ch    = 'A';
boolean flag = true;

// var (Java 10+) - 型推論
var name = "Taro";   // String 扱い
var list = new java.util.ArrayList<Integer>();

制御フロー

// if / else
if (score >= 80) {
    grade = "A";
} else if (score >= 60) {
    grade = "B";
} else {
    grade = "C";
}

// switch (Java 14+ 式)
String season = switch (month) {
    case 12, 1, 2  -> "冬";
    case 3, 4, 5   -> "春";
    case 6, 7, 8   -> "夏";
    case 9, 10, 11 -> "秋";
    default        -> throw new IllegalArgumentException();
};

// for / 拡張 for / while
for (int i = 0; i < 10; i++) { ... }
for (String s : list) { ... }
while (cond) { ... }
do { ... } while (cond);

配列とコレクション

// 配列
int[] arr = new int[5];
int[] nums = {1, 2, 3, 4, 5};
System.out.println(nums.length);  // 5
System.out.println(nums[0]);      // 1

// 多次元配列
int[][] mat = {{1, 2}, {3, 4}};

// コレクション (java.util)
List<String> list = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
Set<Integer> set = new HashSet<>();

list.add("a"); list.add("b");
map.put("apple", 100);

// List.of (Java 9+) は不変
List<Integer> immutable = List.of(1, 2, 3);

クラスとインスタンス

public class User {
    // フィールド
    private String name;
    private int age;

    // コンストラクタ
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // メソッド
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    @Override
    public String toString() {
        return &quot;User{name=&quot; + name + &quot;, age=&quot; + age + &quot;}&quot;;
    }
}

// 利用
User u = new User(&quot;Taro&quot;, 30);
System.out.println(u.getName());

継承 (extends) と インターフェース (implements)

// 抽象クラス
abstract class Animal {
    protected String name;
    public Animal(String name) { this.name = name; }
    public abstract String cry();
}

// 継承
class Dog extends Animal {
    public Dog(String name) { super(name); }
    @Override public String cry() { return &quot;わん&quot;; }
}

// インターフェース
interface Runnable {
    void run();
    default void warmup() { System.out.println(&quot;準備運動&quot;); }  // Java 8+
}

// 複数 implements 可
class Athlete extends Animal implements Runnable {
    public Athlete(String name) { super(name); }
    @Override public String cry()  { return &quot;がんばる&quot;; }
    @Override public void run()    { System.out.println(&quot;走る&quot;); }
}

アクセス修飾子と final / static

修飾子クラス内同パッケージサブクラスその他
public
protected×
(none)××
private×××
public class Constants {
    public static final double PI = 3.14159;     // 定数
    public static int counter = 0;                // クラス共有変数

    private final String id;                      // 一度だけ代入可能
    public Constants(String id) { this.id = id; }
}

Generics (ジェネリクス)

// 型パラメータ
class Box<T> {
    private T value;
    public void set(T v) { value = v; }
    public T get() { return value; }
}

Box<String>  s = new Box<>();
Box<Integer> i = new Box<>();

// 境界
class NumberBox<T extends Number> {
    public double doubleValue(T t) { return t.doubleValue(); }
}

// ワイルドカード
List<? extends Number> nums;   // Number またはそのサブクラス(読み取り専用)
List<? super Integer>  ints;   // Integer またはそのスーパー(書き込み可)

例外処理 (try-catch-finally)

try {
    int n = Integer.parseInt(s);
    Files.readAllLines(Path.of(&quot;data.txt&quot;));
} catch (NumberFormatException e) {
    System.err.println(&quot;数値変換失敗: &quot; + e.getMessage());
} catch (IOException e) {
    System.err.println(&quot;ファイル読み込み失敗: &quot; + e.getMessage());
} finally {
    System.out.println(&quot;必ず実行&quot;);
}

// try-with-resources (Java 7+) - AutoCloseable を自動 close
try (BufferedReader br = Files.newBufferedReader(Path.of(&quot;a.txt&quot;))) {
    String line = br.readLine();
}

Lambda と Stream (Java 8+)

// Lambda
Runnable r = () -> System.out.println("hi");
Comparator<String> cmp = (a, b) -> a.length() - b.length();

// Stream API
List<Integer> nums = List.of(1, 2, 3, 4, 5);
int sum = nums.stream()
    .filter(n -> n % 2 == 0)
    .mapToInt(Integer::intValue)
    .sum();   // 2 + 4 = 6

// メソッド参照
list.forEach(System.out::println);
list.stream().map(String::toUpperCase).toList();

record (Java 14+) と sealed class (Java 17+)

// record - 不変データクラス (boilerplate ゼロ)
public record Point(int x, int y) {}

Point p = new Point(3, 4);
System.out.println(p.x());     // 3
System.out.println(p);          // Point[x=3, y=4]
// equals / hashCode / toString 自動生成

// sealed - 継承できるクラスを制限
sealed interface Shape permits Circle, Square, Triangle {}
record Circle(double r) implements Shape {}
record Square(double s) implements Shape {}
record Triangle(double a, double b, double c) implements Shape {}

FAQ

Q: int と Integer の違いは?
A: int はプリミティブ、Integer はラッパー (参照型)。コレクションには Integer しか入りません。autoboxing で自動変換されます。

Q: == と equals() の使い分け
A: 参照型は equals() で値比較。== は参照同一性。文字列は "a".equals(s) のように定数を左に置くと NullPointerException を防げます。

Q: どの Java バージョンを使うべき?
A: 2026 年時点では Java 21 LTS が標準。レガシー保守でも Java 17 LTS まで上げるのが望ましいです。