LoginSignup
2
0

More than 5 years have passed since last update.

Java - クラス・インスタンス生成 Part.4

Last updated at Posted at 2018-11-12

記事の書かれ方について

授業スライドとかを参考にしてるわけじゃないので、別の切り口から説明されてると思うけど。
たぶん言ってることはあっている(はず)。

アドリブなのでミスがあるかもしれないのであったら教えて!

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クラスを新しく作ってみる。

CardManager.java
class CardManager{
  static int totalCardCount;

  static int getTotalCount(){
    return totalCardCount;
  }

  static void countUpTotalCount(){
    totalCardCount++;
  }
}

で、DigitalStudentCardクラスのコンストラクタに発行されたことを伝える機構を加えよう。

DigitalStudentCard.java
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変数が多いのはあんまりよろしくはないので、「あれ...?」と思ったら設計を見直すことも考えよう。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0