この章では、Java言語の特徴であるオブジェクト指向
とJavaにおけるクラスの基本的な機能について説明していきます
オブジェクト指向
オブジェクト指向とは、プログラムの要素をモノ(オブジェクト)として扱う考え方のことです
オブジェクトは特徴と処理(機能)を持ち、それらを組み合わせてシステムを構築します
- 特徴
「オブジェクトを構成するデータ」であり、どんな特徴があるかを表します
Javaではフィールドと呼び、プログラム中では変数として値を管理します - 処理(機能)
「指示に対するふるまい」を定義します
特徴(フィールド)に対する処理内容を記述し、何かしらの指示があった時にどう動くかといった動作・ふるまいを表現します
プログラム中ではメソッドとして表現されます
たとえば、あるサイト上の会員を設計する場合、特徴、処理は以下のように表現することができます

この会員情報を複数組み合わせて、システムを作成していくような考え方です
Javaでは、オブジェクトの設計図をクラス
で定義し、設計図に基づいたオブジェクト(実体)を作成し、作成したオブジェクトを操作していきます
設計図に基づいて作成したオブジェクトのことをインスタンス
と呼びます
また、オブジェクト(実体)が持っている処理のことをメソッド
といいます
以下の図は、前述した会員情報からインスタンスを作成することを表しています

クラスとインスタンス
それでは、実際のJavaプログラムでクラスの生成方法、およびインスタンスの作成方法などを説明します
1.クラスの宣言
クラスの実装方法は以下のように記述します
// クラス名は大文字で始める
class クラス名 {
// フィールドの宣言:クラスが持つ特徴を定義する
型 変数名;
// メソッド:クラスの機能(処理)を定義する
戻り値型 メソッド名 (引数) {
// 処理内容
return 戻り値;
}
}
先頭にclass
と書き、その後ろにクラス名を書きます
クラス名のあと{}を記述しクラスのブロックを定義します
クラス名は、英大文字から始めますフィールド
は、クラス内部の変数のことをいい、クラスの特徴などを表すデータなどを定義します
変数を定義したときと同じように、型と変数名を定義しますメソッド
はオブジェクトの処理を表しています。戻り値型、メソッド名、引数、戻り値をそれぞれ定義します
2.インスタンスの生成
インスタンス
とはクラス
で定義された特徴や処理(機能)を持つ一つ一つの実体のことをいい、「オブジェクト」と呼ぶこともあります
クラスのインスタンスを生成するには、次のように記述します
(クラスというテンプレートから実体を作成することを表します)
クラス名 変数名 = new クラス名();
new演算子でクラス名からインスタンスを生成し、変数名に代入します
この変数名のことを参照変数
と呼びます
変数名.フィールド名 = 値 // 代入
変数名.フィールド名 // 値の参照
インスタンスの各フィールドへは、上記のように記述してアクセスします
一方、インスタンスのメソッドへのアクセスは以下のように記述します
変数名.メソッド名
クラスとインスタンスを生成する例は以下の通りです
下記のサンプルプログラムは、Personクラスを宣言し、二人分のインスタンスを生成しています
class Person {
// フィールドの定義
// クラスで使用するデータの「名前」と「年齢」をメンバ変数として定義する
String name;
int age;
// 自己紹介をするメソッド
void introduce () {
System.out.println ("My Name is " + this.name + ". " + this.age + "year old.");
}
}
public class Sample{
public static void main(String[] args) {
//人クラスのインスタンスを生成する
System.out.println("***person1***");
Person person1 = new Person ();
person1.name="Yamada Tarou";
person1.age = 21;
person1.introduce();
System.out.println("***person2***");
Person person2 = new Person ();
person2.name = "Suzuki Jiro";
person2.age = 19;
person2.introduce();
}
}
実行結果
***person1***
My Name is Yamada Tarou. 21year old.
***person2***
My Name is Suzuki Jiro. 19year old.
Person person1 = new Person ();
クラスPersonから実体であるperson1を生成しています
person1.name="Yamada Tarou";
person1.age = 21;
newを使用してインスタンス化することで、インスタンスの領域にperson1の領域は確保されましたが、各フィールドの値は不定です
そこで、person1のnameおよびageを初期化しています
System.out.println ("My Name is" + this.name + ". " + this.age + "year old.");
自分自身のフィールドの値を参照しています
自分自身のフィールドにアクセスする場合は、フィールド名の前にthis.
をつけます
person1.introduce();
インスタンスperson1のメソッドを呼び出します
コンストラクタ
クラスのインスタンスが生成されるときに、自動的に実行される命令をまとめたものをコンストラクタ
と呼びます
コンストラクタには、インスタンスの初期化に用いる値を引数として渡すことができますし、引数の異なるコンストラクタを複数宣言することができます
コンストラクタの宣言は次のように記述します
クラス名(引数1,引数2,,,){
命令文;
}
※戻り値の定義は記述しません
※メソッド名に相当する箇所がクラスの名前になります
以下は、前述したPersonクラスに身長(height)、体重(weight)フィールドを加え、引数の異なるコンストラクタを複数宣言したサンプルプログラムです
class Person{
String name;
int age;
double height;
double weight;
Person() {
System.out.println("--pass1--");
this.name = "";
this.age = 0;
this.height = 0;
this.weight = 0;
}
Person(String name, int age){
System.out.println("--pass2--");
this.name = name;
this.age = age;
this.height = 0;
this.weight = 0;
}
Person(String name, int age, double height, double weight){
System.out.println("--pass3--");
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
}
void introduce () {
System.out.println ("My Name is " + this.name);
System.out.println("I'm " + this.age + "years old");
System.out.println("height is " + this.height + "cm");
System.out.println("Weight is " + this.weight + "kg");
}
}
Personクラスを定義します
Person()
引数のないコンストラクタを定義しています
Person(String name, int age)
名前と年齢を引数とするコンストラクタを定義しています
Person(String name, int age, double height, double weight)
名前と年齢と身長、体重を引数とするコンストラクタを定義しています
public class Sample{
public static void main(String []args){
System.out.println ("***a***");
Person a = new Person();
a.introduce();
System.out.println ("***b***");
Person b = new Person("Taro Yamada",20);
b.introduce();
System.out.println ("***c***");
Person c = new Person("Taro Yamada",20,172.5,69.5);
c.introduce();
}
}
実行結果
***a***
--pass1--
My Name is
I'm 0years old
height is 0.0cm
Weight is 0.0kg
***b***
--pass2--
My Name is Taro Yamada
I'm 20years old
height is 0.0cm
Weight is 0.0kg
***c***
--pass3--
My Name is Taro Yamada
I'm 20years old
height is 172.5cm
Weight is 69.5kg
【演習問題】
- Circleクラスを作成し円周、⾯積を計算する関数をそれぞれ実装してみましょう
※円周率は3.14とする
実⾏結果
半径:3.0
円周:18.84
⾯積:28.259999999999998
- 次の要件を満たすクラスを実装してみましょう
お小遣いの管理をするクラスとしてPocketmoneyクラスを作成します
Pocketmoneyクラス:
フィールド:money
メソッド:
depositMmoney(int money); // 入金処理
withdrawals(int money); // 出金処理、持ち金が引数moneyより少なければエラーを表示する
showAmountMoney(); //現在の金額を表示する
実行結果
The remaining pocket money is 10000yen.
I spent 6500yen.
I spent 3500yen.
There was a deposit of 500yen.
I don't have money
The remaining pocket money is 500yen.
コメント