この記事の要点
• クラスはデータ(フィールド)と処理(メソッド)をまとめる設計図
• オブジェクトはクラスから 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.name | p1 オブジェクトの name フィールドにアクセス |
p1.introduce() | p1 オブジェクトの introduce メソッドを呼び出す |
ポイント: p1 と p2 は別々のオブジェクトです。それぞれが独立した name と age を持ちます。
フィールド(インスタンス変数)
クラス内で宣言した変数はフィールド(またはインスタンス変数)と呼ばれます。
| 特徴 | 説明 |
|---|---|
| スコープ | オブジェクトごとに独立 |
| 初期値 | 型のデフォルト値(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
}
}
ポイント: c1 と c2 は別々のオブジェクトなので、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で引数とフィールドを区別
次のステップ
次回はコンストラクタを学び、オブジェクト生成時に初期値を設定する方法を扱います。
参考リソース
- Oracle Java Tutorials - Classes
- Oracle Java Tutorials - Objects
- Java SE 21 Language Specification - Classes