Java の特徴
Java は「一度書けばどこでも動く(Write Once, Run Anywhere)」を目指して設計された言語です。プログラムはまず「バイトコード」にコンパイルされ、Java 仮想マシン(JVM)上で実行されるため、OS に依存せず動作します。これにより、Windows・macOS・Linux・Android など、幅広い環境で同じコードを動かせます。
Java は静的型付け言語です。変数の型をコンパイル時にチェックするため、実行前に多くの不具合を検出できます。型が明確なので、可読性や保守性が高く、チーム開発や大規模プロジェクトに向いています。
ガベージコレクション(不要になったメモリの自動解放)を備え、安全性と安定性に優れます。手動でメモリを解放する必要がないため、初心者でもメモリ管理で致命的なバグを起こしにくいのが特徴です。
豊富な標準ライブラリと巨大なエコシステムがあります。ネットワーク、暗号、並行処理、GUI、データベースなど幅広い領域をカバーし、Spring などの強力なフレームワークも利用できます。
Java プログラムの基本構造
Java のコードは「クラス」単位で構成されます。エントリポイント(最初に実行される場所)は main メソッドです。
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
Javapublic class Helloはクラス宣言です。ファイル名はHello.javaにします。public static void main(String[] args)がエントリポイントです。プログラムはここから始まります。System.out.println(...)でコンソールに文字を出力します。
変数と基本データ型
代表的な基本型
- 整数:
int, より大きい整数:long - 小数:
double(一般的), 高精度が必要ならBigDecimal(クラス) - 文字:
char - 真偽:
boolean - 文字列はクラス:
String(不変=変更不可)
int age = 20;
double price = 1999.5;
boolean isMember = true;
char grade = 'A';
String name = "Tanaka";
Java型の重要ポイント(深掘り)
- 文字列は不変です。
Stringを連結し続けると不要オブジェクトが増えるので、繰り返し連結にはStringBuilderを使うと効率的です。
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 3; i++) {
sb.append("Java");
}
System.out.println(sb.toString());
Java- 整数同士の割り算は整数になります。小数が欲しければどちらかを
doubleにします。
System.out.println(5 / 2); // 2
System.out.println(5 / 2.0); // 2.5
Java演算子と条件分岐・繰り返し
演算子
- 算術:
+ - * / % - 比較:
== != < > <= >= - 論理:
&& || ! - 代入・複合:
= += -= *= /= %=
条件分岐
int score = 75;
if (score >= 80) {
System.out.println("Great!");
} else if (score >= 60) {
System.out.println("Good");
} else {
System.out.println("Try again");
}
Javaswitch は複数ケースを分岐したいときに便利です(Java 14+ の switch 式はより強力)。
int day = 3;
switch (day) {
case 1 -> System.out.println("Mon");
case 2 -> System.out.println("Tue");
case 3 -> System.out.println("Wed");
default -> System.out.println("Other");
}
Java繰り返し
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
int n = 3;
while (n > 0) {
System.out.println(n);
n--;
}
Javaメソッド(関数)とスコープ
メソッド定義
public class MathUtil {
public static int add(int a, int b) {
return a + b;
}
}
Java呼び出し側:
int s = MathUtil.add(3, 5); // 8
Javaパラメータと戻り値の型の重要ポイント(深掘り)
- メソッドは入力(引数)と出力(戻り値)の「契約」です。型で契約が明確になるため、誤用を防げます。
- 副作用を減らすため、可能なら引数を変更しない設計にします(不変オブジェクトを好む)。
スコープ(有効範囲)
- 変数は宣言されたブロック
{ ... }の中だけ有効です。ブロック外からは参照できません。
クラスとオブジェクト指向
クラス設計の基本
クラスは「データ(フィールド)」と「振る舞い(メソッド)」をまとめた設計図です。
public class Person {
private String name; // 外から直接触らせない
private int age;
public Person(String name, int age) { // コンストラクタ
this.name = name;
this.age = age;
}
public String greet() {
return "Hi, I'm " + name + " (" + age + ")";
}
// アクセサ(必要なら)
public String getName() { return name; }
public int getAge() { return age; }
}
Java使い方:
Person p = new Person("Sato", 30);
System.out.println(p.greet());
Javaカプセル化(深掘り)
フィールドを private にして外部から直接変えられないようにします。これにより、オブジェクトの内部整合性を保てます。外部とのやり取りはメソッド経由に限定し、ルールを実装できます。
継承と多態性(ポリモーフィズム)
abstract class Animal {
abstract void speak();
}
class Dog extends Animal {
@Override
void speak() { System.out.println("Woof"); }
}
class Cat extends Animal {
@Override
void speak() { System.out.println("Meow"); }
}
public class Main {
public static void main(String[] args) {
Animal a = new Dog(); // 型は Animal、実体は Dog
a.speak(); // 実行時に Dog の振る舞いが呼ばれる
}
}
Javaポリモーフィズムにより、同じ「型」で異なる実装を差し替えられます。拡張性・テスト容易性が向上します。
配列とコレクション
配列
int[] nums = {1, 2, 3};
System.out.println(nums[0]); // 1
Java配列は固定長です。サイズ変更はできません。
List と Map(コレクション)
import java.util.*;
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
System.out.println(list.get(1)); // "Python"
Map<String, Integer> ages = new HashMap<>();
ages.put("Sato", 30);
System.out.println(ages.get("Sato")); // 30
Javaコレクションは柔軟にサイズ変更でき、実用コードでは配列よりも頻繁に使用します。
例題で学ぶ
例題 1: FizzBuzz(制御構文の総復習)
public class FizzBuzz {
public static void main(String[] args) {
for (int i = 1; i <= 20; i++) {
if (i % 15 == 0) {
System.out.println("FizzBuzz");
} else if (i % 3 == 0) {
System.out.println("Fizz");
} else if (i % 5 == 0) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
}
}
Javaポイント: 条件の順序が重要です。15 の倍数判定を先にすることで重複条件を正しく処理できます。
例題 2: 平均値と最大値(配列・ループ)
public class Stats {
public static void main(String[] args) {
int[] nums = {3, 8, 2, 7, 5};
int sum = 0;
int max = Integer.MIN_VALUE;
for (int n : nums) {
sum += n;
if (n > max) max = n;
}
double avg = sum / (double) nums.length;
System.out.println("avg=" + avg + ", max=" + max);
}
}
Java重要点(深掘り): sum / nums.length は整数割り算になります。(double) で明示的に型変換して小数を得ます。
例題 3: 小さな在庫システム(クラス・コレクション)
import java.util.*;
class Item {
private final String name;
private int stock;
public Item(String name, int stock) {
this.name = name;
this.stock = stock;
}
public void add(int n) { stock += n; }
public boolean take(int n) {
if (stock >= n) { stock -= n; return true; }
return false;
}
public String info() { return name + ": " + stock; }
}
public class Inventory {
public static void main(String[] args) {
Map<String, Item> inv = new HashMap<>();
inv.put("Pen", new Item("Pen", 10));
inv.put("Note", new Item("Note", 5));
inv.get("Pen").take(3);
inv.get("Note").add(2);
for (Item it : inv.values()) {
System.out.println(it.info());
}
}
}
Java設計のポイント: 在庫の増減ルールは Item のメソッドに集約します。外部から直接 stock を触らせないことで、不正状態を防ぎます(カプセル化)。
例外処理とリソース管理
例外の基本
例外は「想定外の状況」を表します。try-catch で捕捉し、適切に対処します。
try {
int x = Integer.parseInt("abc"); // ここで NumberFormatException
} catch (NumberFormatException e) {
System.out.println("数値に変換できません: " + e.getMessage());
}
Java自動リソース解放(深掘り)
ファイルやネットワークは「リソース」を占有します。try-with-resources を使うと、自動でクローズされ安全です。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFile {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("読み取りエラー: " + e.getMessage());
}
}
}
JavaJava の学び方の道筋
まず押さえる順序
- 基本文法(変数・型・演算子・条件分岐・ループ)
- メソッドとスコープ
- クラス設計(カプセル化、コンストラクタ、継承・ポリモーフィズム)
- コレクション(List, Map)とイテレーション
- 例外処理と入出力(try-with-resources)
- 実践的な小課題(FizzBuzz、集計、ミニ CRUD)
小さな練習課題
- 文字列ユーティリティ: 与えられた文章から単語数を数える
- 集計: ユーザーの点数リストから平均・中央値を計算
- クラス設計:
BankAccountクラスを作り、入金・出金・残高照会を実装
仕上げのアドバイス(重要ポイントの再確認)
- 変数の型は「契約」。曖昧さを排除し、誤用を防ぐ武器です。
- 文字列操作は
StringBuilderで効率化。Stringは不変であることを忘れない。 - ルールはクラスに閉じ込める(カプセル化)。フィールドは
private、振る舞いはメソッドで公開。 - リソースは
try-with-resourcesで確実に解放。例外は握りつぶさず、状況をログやメッセージで伝える。 - 「まず動くものを小さく作る → テスト → 拡張」のサイクルで学ぶと、挫折しにくく上達が速いです。
