Java入門 #12 - クラスとオブジェクト

入門 | 10分 で読める | 2026.05.02

公式ドキュメント

この記事の要点

クラスはデータ(フィールド)と処理(メソッド)をまとめる設計図
オブジェクトはクラスから new で作る実体
this は自分自身のインスタンスを指す

このシリーズについて

「Java入門」は1本1テーマで進む全15回のシリーズです。本記事はその第12回として、クラスとオブジェクトを扱います。

前提条件: Java 21 がインストール済み。メソッドの基本を理解していること。

クラスとは

クラス(Class) は「データ」と「処理」をひとまとめにした設計図です。

用語説明
クラス設計図(型の定義)
オブジェクト(インスタンス)クラスから作った実体
フィールド(インスタンス変数)オブジェクトが持つデータ
メソッド(インスタンスメソッド)オブジェクトが持つ処理

例えば「人」を表すクラスを作ると、「名前」と「年齢」をデータとして持ち、「自己紹介する」という処理を持たせられます。

クラス: Person
 ├ データ: name, age
 └ 処理: introduce()

クラスの宣言

class クラス名 {
    // フィールド(データ)
    型 変数名;
    
    // メソッド(処理)
    戻り値型 メソッド名(引数) {
        // 処理
    }
}

基本例: Personクラス

// Java 21
class Person {
    // フィールド(インスタンス変数)
    String name;
    int age;
    
    // メソッド(インスタンスメソッド)
    void introduce() {
        System.out.println("私の名前は " + name + " です。");
        System.out.println("年齢は " + age + " 歳です。");
    }
}

public class ClassExample {
    public static void main(String[] args) {
        // オブジェクトを生成
        Person p1 = new Person();
        p1.name = "太郎";
        p1.age = 25;
        p1.introduce();
        
        System.out.println();
        
        Person p2 = new Person();
        p2.name = "花子";
        p2.age = 30;
        p2.introduce();
    }
}

出力:

私の名前は 太郎 です。
年齢は 25 歳です。

私の名前は 花子 です。
年齢は 30 歳です。
記法説明
new Person()Person クラスから新しいオブジェクトを作る
p1.namep1 オブジェクトの name フィールドにアクセス
p1.introduce()p1 オブジェクトの introduce メソッドを呼び出す

ポイント: p1p2別々のオブジェクトです。それぞれが独立した nameage を持ちます。

フィールド(インスタンス変数)

クラス内で宣言した変数はフィールド(またはインスタンス変数)と呼ばれます。

特徴説明
スコープオブジェクトごとに独立
初期値型のデフォルト値(0, null など)
アクセスオブジェクト名.フィールド名
// Java 21
class Book {
    String title;
    int pages;
}

public class FieldExample {
    public static void main(String[] args) {
        Book book = new Book();
        
        // 初期値はデフォルト値
        System.out.println(book.title);  // → null
        System.out.println(book.pages);  // → 0
        
        // 値を設定
        book.title = "Java入門";
        book.pages = 300;
        
        System.out.println(book.title);  // → Java入門
        System.out.println(book.pages);  // → 300
    }
}

補足: フィールドを private にして外部から直接アクセスできなくするのが良い設計です。詳細は次回の「カプセル化」で扱います。

インスタンスメソッド

クラス内で定義したメソッドはインスタンスメソッドと呼ばれます。

特徴説明
static がない前回の static メソッドと異なる
呼び出し方オブジェクト名.メソッド名()
フィールドへのアクセス自分自身のフィールドに直接アクセス可
// Java 21
class Counter {
    int count;
    
    void increment() {
        count++;  // 自分のフィールドを変更
    }
    
    void show() {
        System.out.println("count = " + count);
    }
}

public class InstanceMethodExample {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        c1.increment();
        c1.increment();
        c1.show();  // → count = 2
        
        Counter c2 = new Counter();
        c2.increment();
        c2.show();  // → count = 1
    }
}

ポイント: c1c2 は別々のオブジェクトなので、count も独立しています。

new によるオブジェクト生成

new 演算子でクラスからオブジェクト(実体)を作ります。

クラス名 変数名 = new クラス名();
処理説明
new Person()メモリ上に Person オブジェクトを作る
変数への代入そのオブジェクトへの参照を変数に格納
// Java 21
class Car {
    String model;
    int year;
}

public class NewExample {
    public static void main(String[] args) {
        Car car1 = new Car();
        car1.model = "プリウス";
        car1.year = 2020;
        
        Car car2 = new Car();
        car2.model = "カローラ";
        car2.year = 2021;
        
        System.out.println(car1.model + " (" + car1.year + ")");
        System.out.println(car2.model + " (" + car2.year + ")");
    }
}

出力:

プリウス (2020)
カローラ (2021)

注意: new を忘れると NullPointerException(ヌルポインタ例外)が発生します。必ず new でオブジェクトを作ってください。

this キーワード

this自分自身のインスタンスを指します。

用途説明
フィールドとの区別引数とフィールドが同名のとき
明示的な参照可読性向上のため
// Java 21
class Rectangle {
    int width;
    int height;
    
    void setSize(int width, int height) {
        // this.width = フィールド
        // width = 引数
        this.width = width;
        this.height = height;
    }
    
    int area() {
        return this.width * this.height;  // this は省略可
    }
}

public class ThisExample {
    public static void main(String[] args) {
        Rectangle rect = new Rectangle();
        rect.setSize(5, 10);
        System.out.println("面積: " + rect.area());  // → 面積: 50
    }
}

ポイント: 引数とフィールドが同名の場合、this を付けないと引数が優先されます。this.width とすることでフィールドを明示します。

実践例: Personクラスの完全版

// Java 21
class Person {
    // フィールド
    String name;
    int age;
    
    // メソッド: 年齢を1増やす
    void birthday() {
        this.age++;
        System.out.println(this.name + " さんは " + this.age + " 歳になりました。");
    }
    
    // メソッド: 自己紹介
    void introduce() {
        System.out.println("名前: " + this.name);
        System.out.println("年齢: " + this.age + " 歳");
    }
    
    // メソッド: 成人かどうか
    boolean isAdult() {
        return this.age >= 20;
    }
}

public class PersonDemo {
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "太郎";
        person.age = 19;
        
        person.introduce();
        System.out.println("成人: " + person.isAdult());  // → 成人: false
        
        System.out.println();
        
        person.birthday();  // → 太郎 さんは 20 歳になりました。
        System.out.println("成人: " + person.isAdult());  // → 成人: true
    }
}

出力:

名前: 太郎
年齢: 19 歳
成人: false

太郎 さんは 20 歳になりました。
成人: true

静的メソッド vs インスタンスメソッド

前回学んだ static メソッドとの違いを整理します。

種類宣言呼び出し方フィールドアクセス
静的メソッドstatic 付きクラス名.メソッド()静的フィールドのみ
インスタンスメソッドstatic なしオブジェクト名.メソッド()インスタンスフィールドにアクセス可
// Java 21
class Calculator {
    int result;  // インスタンスフィールド
    
    // インスタンスメソッド
    void add(int value) {
        this.result += value;
    }
    
    // 静的メソッド
    static int multiply(int a, int b) {
        return a * b;
    }
}

public class StaticVsInstance {
    public static void main(String[] args) {
        // 静的メソッドはクラス名で呼び出す
        int product = Calculator.multiply(5, 10);
        System.out.println(product);  // → 50
        
        // インスタンスメソッドはオブジェクトを作ってから呼び出す
        Calculator calc = new Calculator();
        calc.add(5);
        calc.add(10);
        System.out.println(calc.result);  // → 15
    }
}

補足: main メソッドが static なのは、JVMがオブジェクトを作らずに直接呼び出すためです。

よくあるミス

1. new を忘れる

Person person;
person.name = "太郎";  // エラー: NullPointerException

正しくは:

Person person = new Person();
person.name = "太郎";

2. static メソッドからインスタンスフィールドにアクセス

class Test {
    int value;
    
    static void show() {
        System.out.println(value);  // エラー: static からはアクセス不可
    }
}

正しくは:

class Test {
    int value;
    
    void show() {  // static を外す
        System.out.println(value);
    }
}

3. this の付け忘れ

class Person {
    String name;
    
    void setName(String name) {
        name = name;  // 引数に引数を代入(無意味)
    }
}

正しくは:

void setName(String name) {
    this.name = name;  // フィールドに代入
}

まとめ

項目内容
クラスデータ(フィールド)と処理(メソッド)をまとめた設計図
オブジェクトnew でクラスから作る実体
フィールドオブジェクトが持つデータ(インスタンス変数)
インスタンスメソッドオブジェクトが持つ処理(static なし)
this自分自身のインスタンスを指す
  • クラスは設計図、オブジェクトは実体
  • new でオブジェクトを生成
  • インスタンスメソッドは static を付けない
  • this で引数とフィールドを区別

次のステップ

次回はコンストラクタを学び、オブジェクト生成時に初期値を設定する方法を扱います。

参考リソース

この技術を体系的に学びたいですか?

未来学では東証プライム上場企業のITエンジニアが24時間サポート。月額24,800円から、退会金0円のオンラインIT塾です。

メールで無料相談する
← 一覧に戻る