miyupaca log

Javaでコンストラクタとオブジェクト指向3大要素

2020/08/16

オブジェクト指向を絶賛学習中のmiyupacaです。

前回のJavaでクラスとインスタンスの続きになります。


コンストラクタ

インスタンス化された時に自動的に実行されるメソッド。
クラス名と同じ名前で、戻り値が記述されていないことが条件。

public class Human {
  // コンストラクタ
  public Human() {
	  System.out.println("最初にコンストラクタが呼び出されるよ!")
  }
  ...
}

コンストラクタは記述を省略することができるが、その場合でも処理のないコンストラクタが暗黙的に定義され、インスタンス生成時には呼び出される。

継承

オブジェクト思考3大要素と言われるうちの1つ。
他の既存のクラスに基づいて新しいクラスを定義することができる。
例:人クラスを継承してプログラマークラスを作る。

public class Programmer extends Human {

  ...

}

親クラス(継承元)と子供クラス(継承した方)の関係に違和感がないことが大切。「(子供クラス)は(親クラス)」である、と言って不自然でなければok。
子クラスのインスタンスは親クラスのインスタンスのフィールドやメソッドを引き継いでいる。

多態性

オブジェクト思考3大要素と言われるうちの1つ。
多態性とはざっくりと全体を同じように捉えることができつつも、個々のものはそれぞれの動きをとる、という特性。
例としてProgrammerインスタンスをHuman型の何か、程度の曖昧さで捉えてみる。

Human h = new Programmer();

Programmer型でも宣言できるがHuman型として曖昧に捉えることで、似たようなものをひとまとめに扱いやすくなりつつも、それぞれの型が独自の動きを行うことができる。
プログラマーもデザイナーもディレクターも人だと捉えてまとめてお昼休憩を与えられる(同じものとして扱う)一方で、個々が違う仕事をすることができる(それぞれの動き)。

カプセル化

オブジェクト思考3大要素と言われるうちの1つ。
カプセル化とは適切なアクセス制御を設けることで不正な値が入ることを防ぐこと。
基本的にフィールドはprivateにしてメソッドを介してアクセスすることにする。メソッドはクラス内部だけで使うものはprivateにするなどの調整が必要だが基本はpubricにする。

public class Human {
  // フィールドはクラス内部でのみアクセス可能
  private String name;
  
  // ゲッター...フィールドの値を返すためのメソッド
  public String getName() {
    return this.name;
  }

  // セッター...フィールドに値を代入するためのメソッド
  public String setName(String name) {
    this.name = name;
  }
  ...
}

ゲッター/セッターはフィールドにアクセスするためのメソッド筆頭。

例えば名前をつける時はnameには直接アクセスできないのでsetNameを介して代入を行う。

public class Main {
  public static void main(String[] args) {
    // インスタンスを生成   
    Human h = new Human();

    // フィールドに値を入れる
    // 注:h.name = "taro"; はエラーになる
    h.setName("taro");

    // 値の取得もメソッドを通して行う
    h.getName(); // taro
  }
}

ちなみにクラスそのものにもアクセス制御を行うことができる。
privateはなく、全てのクラスからアクセスできるpubricと、同じパッケージのクラスからのみアクセスを許可するpackage private(クラスの前に何も書かない)の2種類がある。


前回と比べてかーなーり、はしょりましたが自分なりに概要をまとめてみました。例えが微妙だったかもしれません。自分の言葉で説明するって難しい。
オブジェクト指向は書き方以上に何故そうつくるのかを掴むのが大切ですよね(*・ω・)ノ引き続き深めます!


参考

スッキリわかるJava入門 第3版


miyupacaの学習記録ブログです。