メソッド (3) コンストラクタ

コンストラクタ: インスタンス化の時に実行される特殊なメソッド

これまでの作ってきたクラスは、主に次のような使い方をしてきた。

  1. インスタンス化を行い、
  2. 各フィールドの値をセットし、
  3. メソッドを呼び出す。

大抵のクラスでは、インスタンス化の時に行いたい処理がある。上記の例では「各フィールドの値をセットし、」がそれ。
この処理を記述するための専用のメソッドとし、コンストラクタ(constructor)という仕組みがある。

コンストラクタとは

  • インスタンス化の時に実行されるメソッド
  • 定義の書式が普通のメソッドと違う
    • メソッド名をクラス名と同じにする
    • 戻り値の型は書かない(注意: voidではない)
  • 複数のコンストラクタを定義することができる。メソッド名は同じなので、引数の型、数、並び順で区別される。

インスタンス化の注意

  • コンストラクタを1つでも定義した場合は、定義したコンストラクタでしかインスタンス化できない。例えば、引数有りのコンストラクタを1つだけ定義したクラスは、引数無しでインスタンス化することができない。
  • コンストラクタを1つも定義しない場合は、デフォルトコンストラクタが自動的に用意されるので、引数無しでインスタンス化することができる。

コンストラクタを定義して使ってみよう

  • BMIの算出
    • Person.java (コンストラクタを定義しない場合)
    • Main1.java (コンストラクタを定義しない場合)
    • Person.java (コンストラクタを定義する場合)
    • Main1.java (コンストラクタを定義する場合)
  • 三角形

メソッド (2)

前回のまとめ等

  • メソッド
    • 教科書P.74
    • メソッドとは?Cにおける関数と大体同じ。
    • メソッドは、クラスの中に定義される。
    • メソッドの定義には「public」をつける(今のところ、本講義では)
    • Cとの違い: メソッドは、同じクラスのフィールドを使うことができる。
    • trivia: 教科書に「return (x);とも書きます。」とあるが、今時、カッコはつけない(つけるべきではない)ので、当該箇所は無視すること。詳しくは「c言語 return カッコ」等で検索。
  • クラスの概念(教科書P.68)
    • フィールドとメソッドのことを「メンバー」という。
    • クラスはメンバーのみで構成される(メンバー以外の構成要素はない)。
    • クラスは設計図。利用するときはインスタンス(実体、オブジェクト)を作成する。
  • クラスの定義(書式)
    • クラス名は大文字から始める。
    • ファイル名は「クラス名.java」にする(基本的に1クラス1ファイル)。
    • フィールド2つ、メソッド1つ(引数が2つの場合)のクラスの例:

もっとメソッドを定義してみよう

Personクラスのポイント

  • 「/**」から始まるコメントはJavaDocというソースコード中にコードの説明を書いて後から簡単に参照する仕組み。IntelliJ IDEAではカーソルを合わせてF1キーを押すと参照できる。
  • setメソッド(23-29行目)
    • フィールド名と引数名が同じ場合は、どのように扱われるか?メソッド本体では、引数の方が優先されて使われる。メソッド本体でフィールドを参照したい場合は「this.フィールド名」とする(教科書P.110)。
    • メソッドを介してフィールドの値をセットしている。なぜわざわざメソッドを介してセットするのか考えてみよう。
  • getStatusメソッド(35-49行目): 特筆する点無し。
  • getBmiCategoryメソッド(55-64行目)
    • 同じクラス内のメソッドを呼び出すことができる(教科書P.76)
  • getBmiAfterDieting(55-64行目)
    • 引数有りのメソッド

メソッド (1)

前回のまとめ等

  • 変数・演算子・制御文はCとだいたい同じだが、Cにはなかった型としてbooleanとStringがある。比較演算子等がbooleanを返すことに注意。
  • パッケージ(教科書P.164〜)
    • クラスをひとまとめにしたもの
    • パッケージが違えば名前のクラスでも同時に存在できる
    • パッケージに所属した状態とは?: 1) パッケージを表すディレクトリ(フォルダの中にソースコードが入っている)、2) ソースコードにパッケージ宣言が書かれている
  • クラスとは(前回までの説明。クラスの説明の全てではないことに注意すること)
    • データと処理をまとめたもの(教科書P.68)
    • 既存の型を組み合わせて、「新しい型」を作る仕組み
    • 構造体に関数がついたもの(C言語がきちんとわかっている人向けの説明)
  • 前回作ったクラスについて
    • 既存の型(int型)を組み合わせて、新しい型を作った。
    • クラスの中で定義される変数のことを「フィールド」という(教科書P.72)。
    • クラスの定義とその中のフィールドの定義には「public」をつける(今のところ、本講義では)。
    • クラスは「設計図」といえる。実際に使うには、「実体」を作る必要がある。実体のことを「インスタンス」という(教科書では「オブジェクト」と呼んでいる)。
    • インスタンス化(インスタンスを作ること)にはnew演算子を使う(教科書P.70,71)。
    • インスタンスのフィールドにアクセスするには「.」を使う(例えば、以下はフィールドに代入する場合)。

復習

  1. パッケージ「d00000.lecture05」を作る。
  2. d00000.lecture05に、前回と同様にPersonクラスを作る。
  3. さらに次のフィールドを追加する。
    • 名前を表すnameフィールド
    • 年齢を表すageフィールド
    • 運転免許証の有無を表すhasDriverLicenseフィールド

クラスにメソッドを追加する

  • 教科書P.74
  • メソッドとは?Cにおける関数と大体同じ。
  • メソッドは、クラスの中に定義される。
  • Cとの違い: メソッドは、同じクラスのフィールドを使うことができる。
  • メソッドの定義には「public」をつける(今のところ、本講義では)
  • フィールドとメソッドのことを「メンバー」という。
  • trivia: 教科書に「return (x);とも書きます。」とあるが、今時、カッコはつけない(つけるべきではない)ので、当該箇所は無視すること。詳しくは「c言語 return カッコ」等で検索。

フィールド2つ、メソッド1つ(引数が2つの場合)のクラスの例:

PersonにBMIを計算するメソッドを付け加えてみよう。

ポイント:

  • BMIの計算には2つの値(身長と体重)が必要。Cの場合は関数の引数としたが、Personクラスにメソッドを記述する場合、フィールドの値を使えば良い(使うべき)なので、引数無しになる。