記事の書かれ方について
授業スライドとかを参考にしてるわけじゃないので、別の切り口から説明されてると思うけど。
たぶん言ってることはあっている(はず)。
アドリブなのでミスがあるかもしれないのであったら教えて!
4部構成です
Part.1 さっくりインスタンス生成をしてみる
Part.2 コンストラクタを使ってもっとすっきり
Part.3 アクセス制御をして、入ってくる値を制限しよう
Part.4 クラス変数・メソッドを使ってみる ←イマココ
つなぎ
前パートではアクセス修飾子を用いて、クラスの外側からのアクセスを制限した。
class DigitalStudentCard{
//学籍番号
private int num;
//お名前
private String name;
//コンストラクタ
DigitalStudentCard(int num, String name){
//引数のnumをインスタンスのnum(this.num)へ代入
this.num = num;
//同じく
this.name = name;
}
//出力する用のメソッド(自己紹介してもらう)
String getSelfIntroduction(){
return "学籍番号 : " + num + " 名前 : " + name);
}
}
private
アクセス修飾子を付けるとそのクラスの内部でしか変数・メソッドにアクセスできなくなる。
アクセスを制限することで、ゲッタ/セッタを作り、値を変更する際にルールを作ったり、そもそも値の変更を禁止することができる。
staticって何ぞや
static
は日本語に訳すと「静的」って意味になるらしいです。性的じゃないぞ。
インスタンス変数やインスタンスメソッドはインスタンスの数だけ存在することになるけど
静的な変数や静的なメソッドは何度も作られるわけではなく、クラスに対してひとつだけ生み出される。
static
なメソッドや変数を参照するときはインスタンスの生成は不要。
クラス名.変数名
、クラス名.メソッド名()
というような感じで呼べる。
書いてみる
学生証が発行された枚数を数えるCardManager
クラスを新しく作ってみる。
class CardManager{
static int totalCardCount;
static int getTotalCount(){
return totalCardCount;
}
static void countUpTotalCount(){
totalCardCount++;
}
}
で、DigitalStudentCard
クラスのコンストラクタに発行されたことを伝える機構を加えよう。
class DigitalStudentCard{
// 学籍番号
private int num;
// お名前
private String name;
// コンストラクタ
DigitalStudentCard(int num, String name){
// 引数のnumをインスタンスのnum(this.num)へ代入
this.num = num;
// 同じく
this.name = name;
// CardManagerのメソッドを呼ぶ
CardManager.coutUpTotalCount();
}
/* 略 */
}
こうすることで、DigitalStudentCard
クラスのインスタンスが生成された数を数えることができる。
class UseClass{
public static void main(String[] args){
// 適当にインスタンス生成
DigitalStudentCard tanaka = new DigitalStudentCard(118114, "田中角栄");
DigitalStudentCard noguchi = new DigitalStudentCard(118514, "野口英世");
DigitalStudentCard sakamoto = new DigitalStudentCard(118060, "坂本龍馬");
DigitalStudentCard oda = new DigitalStudentCard(118010, "織田信長");
//totalCountを出力してみる
System.out.println(CardManager.getTotalCount());
// 4
}
}
ちなみに
いろんなところでおんなじ値を使いたい!おんなじメソッドを使いたい!なんて時に便利。
例えば文字列を整えるメソッドとか、決まった計算処理を行うメソッドとかがまとまっているような
インスタンス変数を持たないクラスのメソッドへ用いると、わざわざインスタンス生成を行う必要がなくなるのでいいと思う。
ただ... たくさん使うとメモリの無駄遣いになるので注意。
スコープが広い変数とか、static変数が多いのはあんまりよろしくはないので、「あれ...?」と思ったら設計を見直すことも考えよう。