wataruの部屋

20代駆け出しシステムエンジニア 低学歴な人生を歩んで来たため仕事させてくれる社会に感謝しています。 ブログの内容は映画やプログラミングに関することなど...

5章<クラス定義とオブジェクトの生成・使用>

今週のお題「桜」

クラスの定義やオブジェクトの生成・使用についてまとめる。

構成は以下の通り

クラスとオブジェクト

コンストラク

オーバーロード

static変数とstaticメソッド

アクセス修飾子とカプセル化

値渡しと参照渡し

ガベージコレクタ

パッケージ宣言とインポート


◆クラスとオブジェクト

クラスとはオブジェクトを生成するための模型、雛形

クラスは属性と操作を持ちます。
これらは変数とメソッドとして表現される

クラスはコンパイルをするとクラスごとに.classファイルが生成される

ひとつのファイルにpublicクラスはひとつしか宣言できない。

変数にはメンバ変数とローカル変数がある
メンバ変数はクラス内でアクセス可能で
ローカル変数は宣言したブロック内でアクセス可能


f:id:koko55120:20190223224304p:plain


これを変数のスコープという。

◆コンストラク

オブジェクトが生成されるときに呼ばれる。
コンストラクタのルールは以下の通り。

・クラス名と同じ名前で宣言する
・戻り値は指定できない
オーバーロード
・this句の使用で別のコンストラクタを呼ぶことができる
・new句で呼び出される

f:id:koko55120:20190223224558p:plain
サブクラスでコンストラクタが呼び出される前にスーパークラスのコンストラクタが呼び出される。

何もコンストラクタを記載しない場合、引数なしのコンストラクタが生成される
これをデフォルトコンストラクという。
引数ありのコンストラクタを宣言すると、デフォルトコンストラクタは生成されない
なので、引数なしでインスタンス化など行うとエラーになる。

コンストラクタ内でthis();句やsuper();句で同一内コンストラクタやスーパークラスのコンストラクタを呼び出すことができる。 これらの記載は必ず一行目に書かなければならない。
なのでsuper();とthis();を同一内で書くのは不可能。

サブクラスで引数なしのコンストラク
スーパークラスは引数ありのコンストラクタが宣言されている場合。
スーパークラスのコンストラクタが先に呼び出されるため
引数なしで呼び出しができなくなる。
これはプログラマが明示しなくてもsuper()と引数なしのスーパークラスを呼び出すよう自動で記載されるため。
なのでサブクラス側でsuper();句をプログラマが明示すれば問題ない。

オーバーロード

同一メソッドで引数の型が異なるか、同じ型でも順番が異なればオーバーロードとみなされる。

コンストラクタもオーバーロードできる。

あいまいなメソッド呼び出し
オーバーロードの条件を満たしていても、引数とマッチするメソッドが複数ある場合
javaの仕様でエラーを返すようになっている。
f:id:koko55120:20190223225829p:plain

◆static変数とstaticメソッド

static変数とstaticメソッドはインスタンス化しなくても呼び出しができる。
これはstatic領域で値を管理するから

呼び出しの構文はclass名.static変数

class名.staticメソッド
f:id:koko55120:20190223230223p:plain

staticメンバとインスタンスメンバのアクセスには注意が必要。
インスタンスメンバからstaticメンバへのアクセスは可能である
staicメンバからインスタンスメンバへのアクセスは不可能であるので注意 アクセスするにはインスタンスが必要。

◆アクセス修飾子とカプセル化

public すべてのクラスからでも参照可
protected 同一パーケージ内のクラスから参照可
 異なるパッケージのクラスが継承関係にある場合publicと同じ働きをする。
 異なるパッケージのクラスが継承関係にない場合privateと同じ働きをする。
private 同一クラス内からのみ参照可

カプセル化の基本 ・属性をprivateにし、操作publicにする

このようにするカプセル化することで外部から変数が書き換えられることもなくなる。

◆値渡しと参照渡し

・基本データ型(プリミティブ型)を引数にメソッドに値を渡した時 メソッドではその値のコピーを受け取ります。これを参照渡しという

・参照型の場合はメソッドの受け取りも同じデータを指す参照をもらうので、メソッド内で書き換えると反映される。 f:id:koko55120:20190223233116p:plain

◆ガベージコレクタ

javaにはガベージコレクタという機能があり
プログラマが使用しなくなったメモリを検出し開放します。

オブジェトがどこかで参照されている間はガベージコレクタの対象にはならない。

nullを代入するとガベージコレクタの対象になります
※これはnullは「この変数はオブジェクトを参照しない」を表現するから

finalize();メソッドはガベージコレクタによってオブジェクトが破棄される寸前に
java実行環境により必ず呼び出されるメソッドです。

ただ、何も書いていないので、オーバライドして使用します。

◆パッケージ宣言とインポート

javaでの開発ではクラスをたくさん作るためパッケージ単位で管理する

package文は必ずソースファイルの一番上に記載する
import文よりも上に書く

import宣言でpackage内のクラスを利用できる
*を使用することで配下すべてのクラスをインポートできる

staticインポート
外部クラスのstaticメンバを参照するときに簡略化して参照できる。

staticiインポートで変数名やメソッド名だけで参照できるようになる。 従来はクラス名.変数名で参照する必要があった。

import static package名;



無名packageのクラスは無名なpackageのクラスからしかアクセスできない