Javaオブジェクトとクラス:コアOOP概念を完全理解
Javaのオブジェクト指向サポート
Javaはオブジェクト指向言語として、以下の基本概念をサポートします:
- ポリモーフィズム(多態性)
- 継承
- カプセル化
- 抽象化
- クラス
- オブジェクト
- インスタンス
- メソッド
- メッセージパッシング
本章では「クラス」と「オブジェクト」に焦点を当てます。
オブジェクトとは
現実世界には車、犬、人間など多数のオブジェクトが存在し、すべて状態と振る舞いを持ちます。
- 犬の状態:名前、品種、色
- 犬の振る舞い:吠える、尻尾を振る、走る
ソフトウェアオブジェクトも同様に、状態はフィールドに格納、振る舞いはメソッドで表現されます。メソッドがオブジェクト内部状態を操作し、オブジェクト間通信はメソッド呼び出しで行われます。
クラスとは
クラスは個々のオブジェクトを生成するための設計図(ブループリント)です。
クラス定義例
public class Dog {
String breed;
int age;
String color;
void barking() { }
void hungry() { }
void sleeping() { }
}
クラスに含まれる変数の種類
- ローカル変数:メソッド/コンストラクタ/ブロック内で定義。メソッド内で宣言・初期化、完了時に破棄
- インスタンス変数:クラス内、メソッド外で定義。インスタンス化時に初期化。同クラスの全メソッド/コンストラクタ/ブロックからアクセス可能
- クラス変数:クラス内、メソッド外、
staticキーワード付きで宣言
コンストラクタ
クラスには必ずコンストラクタがある。明示しなければJavaコンパイラがデフォルトコンストラクタを生成。新オブジェクト作成時に必ず1つ以上のコンストラクタが呼び出される。ルール:クラス名と同名、戻り値型なし、複数定義可(オーバーロード)。
コンストラクタ例
public class Puppy {
public Puppy() { } // 引数なし
public Puppy(String name) { // 引数あり
// パラメータ name を使用
}
}
Javaはシングルトンクラス(インスタンス1つのみ)もサポート。
オブジェクトの生成(3ステップ)
- 宣言:オブジェクト型の変数宣言
- インスタンス化:
newキーワードでオブジェクト生成 - 初期化:
newに続けてコンストラクタ呼び出し、初期化完了
オブジェクト生成例
public class Puppy {
public Puppy(String name) {
System.out.println("Passed Name is :" + name);
}
public static void main(String[] args) {
Puppy myPuppy = new Puppy("tommy"); // 3ステップ一度に
}
}
Passed Name is :tommy
インスタンス変数とメソッドへのアクセス
生成したオブジェクト経由でアクセス:
/* オブジェクト生成 */ ObjectReference = new Constructor(); /* 変数アクセス */ ObjectReference.variableName; /* メソッド呼び出し */ ObjectReference.MethodName();
アクセス例
public class Puppy {
int puppyAge;
public Puppy(String name) {
System.out.println("Name chosen is :" + name);
}
public void setAge(int age) { puppyAge = age; }
public int getAge() {
System.out.println("Puppy's age is :" + puppyAge);
return puppyAge;
}
public static void main(String[] args) {
Puppy myPuppy = new Puppy("tommy");
myPuppy.setAge(2);
myPuppy.getAge();
System.out.println("Variable Value :" + myPuppy.puppyAge);
}
}
Name chosen is :tommy Puppy's age is :2 Variable Value :2
ソースファイル宣言ルール
- 1ソースファイルにpublicクラスは1つのみ
- 非publicクラスは複数可
- publicクラス名=ソースファイル名(
.java付き) - package文がある場合はファイル先頭に記述
- import文はpackage文とクラス宣言の間に記述(packageなしなら先頭行)
- import/package文はファイル内全クラスに適用(クラスごとに別指定不可)
Javaパッケージ
クラス/インターフェースを分類・整理する仕組み。大規模開発では必須。
import文
完全修飾名(パッケージ+クラス名)を与えるとコンパイラが容易に特定可能。import文で場所を指定。例:import java.io.*;でjava_installation/java/io配下全クラスを読み込み。
ケーススタディ:Employee / EmployeeTest
2クラス構成で実践的な例を示します。
Employee.java
import java.io.*;
public class Employee {
String name;
int age;
String designation;
double salary;
public Employee(String name) { this.name = name; }
public void empAge(int empAge) { age = empAge; }
public void empDesignation(String empDesig) { designation = empDesig; }
public void empSalary(double empSalary) { salary = empSalary; }
public void printEmployee() {
System.out.println("Name:"+ name);
System.out.println("Age:" + age);
System.out.println("Designation:" + designation);
System.out.println("Salary:" + salary);
}
}
EmployeeTest.java
import java.io.*;
public class EmployeeTest {
public static void main(String[] args) {
Employee empOne = new Employee("James Smith");
Employee empTwo = new Employee("Mary Anne");
empOne.empAge(26);
empOne.empDesignation("Senior Software Engineer");
empOne.empSalary(1000);
empOne.printEmployee();
empTwo.empAge(21);
empTwo.empDesignation("Software Engineer");
empTwo.empSalary(500);
empTwo.printEmployee();
}
}
コンパイル・実行・出力
C:\> javac Employee.java C:\> javac EmployeeTest.java C:\> java EmployeeTest Name:James Smith Age:26 Designation:Senior Software Engineer Salary:1000.0 Name:Mary Anne Age:21 Designation:Software Engineer Salary:500.0
次の章へ
次回はJavaの基本データ型と、アプリケーション開発での活用法を説明します。
Java
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
- C++フレンド関数とフレンドクラス:アクセス制御のマスター
- Java変数とリテラル:包括的ガイド
- Javaクラスとオブジェクト:実践ガイド
- Javaのfinalキーワード完全解説:変数、メソッド、クラスでの活用法
- Java instanceof演算子完全ガイド:基本から継承・インターフェースまで
- Java抽象クラスとメソッド:包括的ガイド
- Javaネストクラスとインナークラス完全ガイド:種類、例、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaシングルトンパターン完全解説:安全な実装と活用法