Javaのクラスの仕組みとサンプルです。
目次
クラスの仕組み | クラスとは |
クラスからインスタンスを生成する | |
静的変数と静的メソッド(クラスからインスタンスを生成しないで利用) |
クラスとは
[修飾子] class クラス名 { フィールド メソッド } |
- クラスは、データ(フィールド)と処理(メソッド)を定義できます。
- クラスは設計図や型枠のイメージです。クラスからオブジェクト(インスタンス)を生成して利用します。
※クラスからオブジェクト(インスタンス)を生成しないで利用することもできます。 - 機能を他のクラスに継承させることができます。
クラスのサンプルです。
package test1;
public class Color {
private String name; //フィールド変数
public String getName() { //メソッド
String moji = "色は"; //変数
return moji + name;
}
public void setName(String name) { //メソッド
this.name = name;
}
}
3~13行目までがColorというクラスです。
波括弧({ })で囲まれた部分をブロックと呼びます。3~13行目までがクラスのブロックです。
その中にメソッドのブロック(6~9行目と10~12行目)があります。
パッケージ
package test1;
1行目は、packageというキーワードがあります。パッケージであることを示します。
パッケージ名は、「test1」で名前空間を表します。
名前空間は、名前の重複を防ぐことができます。
例としてtest1パッケージのColorクラスと、test2パッケージのColorクラスは別のものとして区別できます。
パッケージ名は全て小文字にします。
クラス
public class Color {
3行目は、classというキーワードがあります。クラスであることを示します。
クラス名は、「Color」です。クラス名はPascal形式にします。(最初の文字は大文字で別の単語とつなげた場合はその単語の先頭を大文字にします)
publicがついたクラスはファイル名も同じになります。この場合は、Color.javaです。
フィールド(データ)
private String name; //変数
4行目の「name」はクラスの変数です。メンバー変数、フィールド、フィールド変数、インスタンス変数とも呼びます。変数にはデータ(値)がセットされます。
変数名は、camelCase形式にします。(最初の単語は全て小文字で別の単語とつなげた場合はその単語の先頭を大文字にします)
privateは、アクセス修飾子です。クラスの外部からのアクセスを不可にします。アクセスの有効範囲のことをスコープと呼びます。スコープは狭いほうが影響範囲が狭まり修正しやすくなります。
Stringはデータ型です。変数の値は文字列であることを示します。
この変数には初期値を設定していません。その場合、String型の変数の初期値はnullになります。
数値型の場合は0、真偽値型の場合はfalseです。
この1行のことを文(statement)と呼びます。文の末尾にはセミコロン(;)がつきます。
privateの左はコードを見やすくするために空白があります。これをインデントまたは字下げと呼びます。
右側にはスラッシュ(/)が2つあります。これはコメントです。プログラム実行に影響はありません。
コメントを複数行書く場合は、コメントの前後にスラッシュとアスタリスクを使用します。
例: /* コメント */
メソッド(処理)
public String getName() { //メソッド
String moji = "色は"; //変数
return moji + name;
}
public void setName(String name) { //メソッド
this.name = name;
}
6行目の「getName」と10行目の「setName」は、クラスのメソッドです。
メソッド名は、camelCase形式にします。(最初の単語は全て小文字で別の単語とつなげた場合はその単語の先頭を大文字にします)
6行目のpublicはアクセス修飾子です。クラスの外部からアクセスできることを意味します。その後のStringは戻り値がString型であることを意味します。
7行目は、メソッドの中にmojiという変数があります。この変数はローカル変数といいます。
ローカル変数の有効範囲はメソッド内のみです。
ローカル変数は初期値をセットしないで使用するとコンパイルエラーになります。
8行目のreturnは、値(moji + name)を返します。返される値を返り値または戻り値と呼びます。
10行目のString nameは、引数です。外部からString型の値を受け取ります。仮引数とも呼びます。
(このメソッドを呼び出す側の引数は実引数と呼びます)
その前にあるvoidは戻り値は無しという意味です。メソッドと引数をあわせてシグネチャともいいます。
11行目のthis.nameのthisは、インスタンスの変数を指します。
Java クラスのthisのサンプル
クラスからインスタンスを生成する
クラスからインスタンス(オブジェクト)を生成する場合は、new演算子を使用します。インスタンス化といいます。
データ型 変数 = new クラス名(); //クラスからインスタンスを生成 |
上記の図はクラスからインスタンス(オブジェクト)を3つ生成したときのイメージです。
インスタンスごとにデータを管理できます。
例えると、クラスは設計図、型枠でインスタンスは実体です。
以下は、クラスからインスタンスを生成して利用するサンプルです。
上記「クラスのサンプル」のColorクラスからインスタンスを生成します。
package test1;
public class Test1 {
public static void main(String[] args) {
//インスタンスを作成
Color c1 = new Color();
Color c2 = new Color();
Color c3 = new Color();
//インスタンスのメソッドを使用
c1.setName("赤");
c2.setName("黄");
c3.setName("青");
System.out.println(c1.getName()); //色は赤
System.out.println(c2.getName()); //色は黄
System.out.println(c3.getName()); //色は青
}
}
インスタンスを生成
Color c1 = new Color();
Color c2 = new Color();
Color c3 = new Color();
7~9行目は、上記のColorクラスのインスタンスを3つ生成しています。
Color c1のColorは変数の型で、c1は変数です。
メソッドを使用(1)
c1.setName("赤");
c2.setName("黄");
c3.setName("青");
12~14行目は、メソッドを使用してインスタンスに値をセットしています。
ポイントは、インスタンスごとに保持するデータが異なる点です。
メソッドを使用(2)
System.out.println(c1.getName()); //色は赤
System.out.println(c2.getName()); //色は黄
System.out.println(c3.getName()); //色は青
16~18行目は、メソッドを使用してインスタンスの値を表示しています。
構文は、変数.メソッド名です。
インスタンスを1つのみ生成したい場合は、シングルトンというデザインパターンを使用します。
Java シングルトン(Singleton)のサンプル
静的変数と静的メソッド(クラスからインスタンスを生成しないで利用)
static修飾子がつくとインスタンスを生成せずクラスで動作します。
定数やユーティリティメソッドなどで使用されます。
package test1;
class Sample {
static int CNT1 = 100;
static void runSample(){
System.out.println("テスト1");
}
}
public class Test1 {
public static void main(String[] args) {
System.out.println(Sample.CNT1); //100
Sample.runSample(); // テスト1
}
}
3~8行目は、Sampleというクラスです。
静的変数(static変数)
static int CNT1 = 100;
4行目は、変数の前にstaticがついています。
static変数やクラスフィールドや静的フィールドとも呼ばれます。
定数として使用する場合にはfinal修飾子もつけます。
Java finalのサンプル(定数として使用/継承不可)
静的メソッド(staticメソッド)
static void runSample(){
System.out.println("テスト1");
}
5行目は、メソッドの前にstaticがついています。
インスタンスを生成せずに使用できるメソッドになります。
staticメソッドやクラスメソッドや静的メソッドとも呼ばれます。
インスタンスを生成しないで使用する
System.out.println(Sample.CNT1); //100
Sample.runSample(); // テスト1
11行目は、newでインスタンスを生成していませんがSampleクラスの変数を参照できます。
構文はクラス名.変数名です。
12行目もnewでインスタンスを生成していませんがSampleクラスのメソッドを実行できます。
構文はクラス名.メソッド名です。
11,12行目とも参照先にstaticが付いていない場合は、コンパイルエラーになります。
オブジェクトとインスタンスの使い分け
ここでは以下のように使用しています。
インスタンス | クラスから実体化したもの |
オブジェクト | 設計工程での用語。インスタンスとニアリーイコール。 |
関連の記事
Java クラスの継承の仕組みとサンプル
Java コンストラクタのサンプル
Java オーバーライドのサンプル
Java オーバーロードのサンプル