はじめに
下記のYouTubeがとてもわかり易かったので、自分なりにまとめました。(メモの様になってしまいすみません🙇♀️)
「Java基礎学習」再生リストの#1へ飛びます。
用語の解説やなぜその記述が必要なのか?など丁寧に解説されています。
Java学習してるけど曖昧なところが多い、という方はぜひ!
メソッドの定義の書き方
基本構文
修飾子 戻り型 メソッド名 (引数型 引数名) {}
修飾子:よく分かっていません…
戻り型:メソッド実行時に最終的にreturnされる型
メソッド名:一行が長いのでわかりにくいが戻り型の直後がメソッド名
引数:()内で変数の宣言ができる(直前に別途で宣言する必要はない)
void使うとき?
戻り値のないメソッドの場合はvoid(戻り値がないので型なんてものもない→なにもないよ:voidってこと)
例)表示させるだけでデータを返す必要がない場合
System.out.println("なんでもいい文字列");
しか 返さないメソッド
→文字列を表示させてるだけのパターン
戻り値がない場合はreturnもいらない、逆に戻り値がある場合はreturn忘れずに
mainメソッドは必ず一番初めに実行される超特別メソッド!
最初になくても一番初めに実行される、ちなみに最後もmainで終了(他のメソッドでは終わらずmainメソッドに戻ってくる)
無いとエラーになる
public static void main(String[] args) { }
戻り値:何も返さない == 戻り値がない、のでvoidが使われている
引数:String[] args はコンパイル後、プログラム実行の際に引数を渡すとargs
の中に代入してくれる。プログラムの中で宣言しなくても始めからデータを使えるようになる
使う場合はargs[0]
で使えるようになる
→SUMメソッドだとプログラムの実行の際に1 2
と引数を渡すと3が返ってくる、ってことが出来るらしい
オーバーロード
同じメソッド名でも引数の数や型が違うと別のメソッドとして扱われる
→これを「オーバーロードする」という
オーバーロードの恩恵を感じられるメソッド
System.out.println();
PrintStreamクラス
という所で全ての型に対応するたくさんのメソッドが定義されているおかげで型を気にしなくても使えてる
→int型を引数に渡せばint型で定義されたメソッドが動く
String型を引数に渡せばString型で定義されたメソッドが動く
スコープとローカル変数
スコープ:変数の有効範囲
変数のスコープは宣言された{ ~ }
のブロック内のみ
理由:ブロック内の処理が終わると変数は消去されてしまうためスコープ外からは参照できない
例えばmainで宣言すればどこでもその値を参照したり、代入できる
→mainの処理が終わると変数は消去される
メソッド内で定義した変数は「ローカル変数」という
オブジェクト指向
『ある役割を持ったモノ』ごとにクラスを分割して、モノとモノとの関係性を定義していくことでシステムを作り上げようとするシステム構成の考え方
メリット:大規模でも一気に開発が可能、メンテナンス性などたくさん
オブジェクトが持つ情報(車の場合)
-
機能:オブジェクトは何が出来るか(加速・減速・ライトが光る など)
→メソッド -
属性:どんなものか?情報(車種名・オーナー・塗装色 など)
→フィールド(変数)
クラス直下で宣言された変数を「フィールド」と呼ぶ
特別な変数!であり、クラスが表現しているモノの情報を表す
メソッド + フィールド を 『メンバ』 と呼ぶ
インスタンスの活用
基本構文
型 変数名 = new クラス名();
↓↓
クラス名 インスタンス名 = new コンストラクタ名();
⚠コンストラクタは後述
実はString型を使用する際は
String「クラス名」 name「インスタンス名」 = new String();
が正しいが、いちいちnewはめんどくさいので特別にプリミティブ型の様な使い方が特別に許されている。
→「疑似プリミティブ型」と呼ばれている
String name = "モーイ";
コンストラクタ
インスタンス化されると同時に自動で動き出す超特別なメソッド。
フィールドに実態を定義する上で必要な初期値を代入する役割を担う。
クラス直下のフィールドは宣言するだけで中身は入れない
(入れると全てがその情報でインスタンス化してしまい、同じモノが量産されてしまう)
↓↓
しかし中身がないとインスタンス化とは呼べない(概念?のようなあやふやなモノくらいしか作られない)
↓↓
その後に正式にそれぞれの情報を代入して属性を作り上げる?
↓↓
大変なので フィールド + コンストラクタ を使用!※フィールドは必要
インスタンス作成時のnew コンストラクタ名();の部分はこの定義したコンストラクタを呼び出してる!
ルール・特徴
基本構文
クラス名() {}
- メソッドだが戻り値は必要ない
※voidすら不要 - コンストラクタ名はクラス名と同じ
※メソッド名ルールから外れ大文字スタートになる - インスタンス生成時、必ず最初に呼び出される
とりあえずフィールドの変数に"未登録"とかをそれぞれ突っ込んどく
メソッドの一種なので、様々な引数パターンに応じて『オーバーロード』して定義することが出来る(同じ名前の複数のコンストラクタを用意できる)
例)フィールドに変数が宣言されている前提
Sample_car(String cm, String on, int sp) {
this();
CarModel = cm;
owner = on;
speed = sp;
}
これで引数が3つのパターンのコンストラクタが定義された
this();
引数ありのコンストラクタで使用する→「引数なしのコンストラクタ」を呼び出す
これを書かないと引数なしで定義したものをそっくりそのまま書き写して、変更したいところだけ変える
みたいなことをしなくてはならない
→this();を使うことで共通部分は排除して、変更部分には「代入」という形でメソッドを定義することが出来る
前提:コンストラクタは深いところから順に実行されていくのでthis();
があると「引数なしのコンストラクタ」を先に見に行く
逆にthis();
がブロックの途中にあるとコンパイルエラーになるので必ず先頭に記述が必要
this.変数名
thisは自分を示す
特に渡す引数名と変数名が被っていると、引数内で宣言した自分の変数を示しているのかクラスで宣言した変数なのかわけわからなくなる
→フィールドの変数名とローカル変数名で被るとローカルが優先される
this.変数名にすれば必ずフィールドで宣言した変数を示すので、こういったエラーを回避できる
デフォルトコンストラクタ
コンストラクタを定義していない場合はJavaの裏側で引数なし・処理なしのコンストラクタを定義してくれる
→コンストラクタがなくても引数なしのインスタンスを作成できる
ただし一つでもコンストラクタを作成している場合はデフォルトコンストラクタはなくなる
その他
一つのクラスを実行するのに複数のファイルを作成する理由?
『台本』と『モノを作るクラス』で分けてある
例)じゃんけんのプログラム
『じゃんけんクラス(台本)』と『プレイヤークラス』と『審判クラス』を作成