クラスライブラリとクラスの応用についてわからない点をまとめてみた

今回も引き続きJavaです。
難しいとこ抜粋してまとめます。


クラスライブラリとは

JDKには、よく使われる機能をまとめてあるクラスライブラリというものがあります。どっかの誰かが機能をまとめてくれてるのです。そして私たちはそれを呼び出すだけで使えます。言い方は雑だけどそんな感じ。

Stringクラスのメソッド

charAt(int n)

引数の位置にある文字を返す

indexOf(int n)

引数の文字(列)の最初の位置を返す

length()

文字列の長さを返す

toLowerCase()

小文字に変換する

toUpperCase()

大文字に変換する

文字列オブジェクトを作成するときの注意点

オブジェクトを作成するときにはnewを使って作成します。しかしStringクラスのオブジェクトは

String str = "HelloWorld";

と書くことができます。

String str = new String("HelloWorld");

この上下での書き方の違いは、単純に長いか短いか、簡単か複雑かだけではありません。

上の書き方は、HelloWorldというオブジェクトがメモリ上にないか検索します。そしてその後、メモリ上になければ新たにHelloWorldオブジェクトを作成します。

String str1 = "HelloWorld";
String str2 = "HelloWorld";

つまり、こうした場合のstr1とstr2は同じHelloWorldオブジェクトを指し示すことになります。

では下の書き方ではどうなるのか。

下の書き方では、メモリ上に既にHelloWorldオブジェクトがあろうとなかろうと、常に新たにHelloWorldオブジェクトを作成することになります。

簡単かつメモリの余分な部分を使うことにもならないので上の書き方が推奨されている、だそう。

文字列の中身を変更するStringBufferクラス

append(char c)

append(String str)

引数の文字(列)を追加する

insert(int n, char c)

insert(int n, String str)

引数の位置に文字(列)を追加する

reverse()

文字を逆順にする

数学的な機能をまとめたMathクラス

max (int x, int y);
max (double x, double y);

2つの引数のうち大きい方を返す
これのそのまま逆でmin、小さい方を返す、というものもある

nulのしくみ

 クラス型の変数にnullを代入すると、その変数はオブジェクトを指し示さなくなる。そして、オブジェクトがどの変数からも扱われなくなるとJavaの判断によってオブジェクトがメモリ上から破棄される。このことをガーベッジコレクションという。
 ちなみにオブジェクトが破棄されるときには、finalize()というメソッドが自動的に呼び出される。このメソッドは定義することもできるが、ガーベッジコレクションが行われるタイミングはJavaの判断のため、メソッドを呼び出すタイミングは管理できない。

クラスの拡張、継承

 簡単に言うと、すでに作成したクラスから新しいクラスを作ること。例えば、車クラスを用いて、レーシングカークラスをつくったり、ミニバンクラスを作ったり、軽自動車クラスを作ったり。このことをクラスを拡張する、という。このとき、元のクラスをスーパークラス、新しいクラスをサブクラスと言い、スーパークラスのメンバをサブクラスが受け継ぐことを継承という。書き方としては

class サブクラス名 extends スーパークラス名{
    メンバ
}

となる。

サブクラスのオブジェクト

 サブクラスのオブジェクトを作成すると、スーパークラスメソッドも呼び出すことができる。なぜなら、スーパークラスのメンバが継承されているから。この仕組みを利用することでプログラムを効率的に作成できる。

コンストラクタの呼び出し

 サブクラスのオブジェクトを作成した際、特に何も指定しないと、スーパークラスの引数無しのコンストラクタが呼び出される。スーパークラスコンストラクタ複数ある場合には、super()を用いることで、明示的に指定できる。
例えば

super();

これでは、引数なしのコンストラクタが呼ばれ

super(n, m);

これでは引数2個のコンストラクタが呼び出される。

オーバーライド

 オーバーライドとは、スーパークラスとまったく同じメソッド名、引数の型、数をもつメソッド複数定義することができる仕組み。つまり

class A {
    ...
    public void show(){...}
}

class B extends A{
    ...
    public void show(){...}
}

(めっちゃ省略してる)とすることで、show()メソッドの中身が全く別でも同じ名前で定義できる。なぜ、このようなことをするのか、単純に違うメソッドを用意すれば良いのではないのか。答えは単純に言うと、こうした方がメソッドも少なくて済むしわかりやすいっしょってこと。せっかくクラスの拡張とかでメンバを継承してるんだから、まとめられるものはまとめてしまった方がシンプルなプログラムが書けますねっていう。
 ちなみに、サブクラスのオブジェクトを作成してそのまま実行すると呼び出されるメソッドはサブクラスの方になります。さらにちなみに、サブクラスのオブジェクトはスーパークラスの変数で扱うこともできます。ただしこの場合は、サブクラスで新しく定義したメソッドは呼び出せません。

オーバーロード

 ここで復習のためにオーバーロードについて記載しておく。
オーバーロードとは、同一クラス内でメソッド名が同じで、引数の形式が異なるメソッドを定義すること。

最終兵器final修飾子

 最終兵器final修飾子です。勉強中になぜかこのフレーズが気に入ったのでずっと言ってる。最終兵器final修飾子。意味としては、修飾子にfinalを付けるとオーバーライドされなくなります。メソッドであれば、サブクラスで同じメソッドが定義できなくなるし、クラスに付けるとサブクラスそのものが宣言できなくなる。そしてフィールドにつけると、値を変更できなくなって定数になります。注意点としては、このとき必ず初期化する、ということです。

objectクラス

 今までスーパークラスを拡張してサブクラスを作成していましたが、じゃあ、スーパークラススーパークラスはどこなのか、根本はどこやねんというと、objectクラスです。あらゆるクラスは根本にこのobjectクラスを持ちます。

toString()メソッド

 objectクラスにtoString()メソッドというものがあります。これは、オブジェクトを文字列であらわしたものを戻り値として返します。そしてこのメソッドは基本的にオーバーライドして使います。これを使うことで何が便利になるのかというと、そのままですがオブジェクトをあらわす文字列を定めることができます。オブジェクトをいっぱい出力したりするときにこれがあればわかりやすいねっていうこと。

equals()メソッド

 またしてもobjectクラスのメソッドです。今度はなんやねん、と。2つの変数が指しているオブジェクトが同じものだとtrueを返します。つまりbooleanです。中身を見ずに単純に変数が示すオブジェクトが同じかどうかだけで判断します。
 ちなみにStringクラスにもequals()メソッドがあります。これは、2つのオブジェクトが表している文字列の内容が同じかどうかを判断します。つまり、オブジェクトが別でも中身が同じならtrueです。

getClass()メソッド

 最後です。これはオブジェクトが属するクラスの情報を返します。もうこのままです。クラスの情報を見たからなんやねんと思うかもしれませんが、例えばこれで条件分岐することも可能なのではないでしょうか。また、プログラムが長くなったり、複雑になったときの確認としてクラスの情報が取得できます。




今回は以上です。
まだまだ勉強中なので訂正箇所等たくさんあるかと思います。
もし読んでいただいて、間違っている箇所があればコメントをいただければ幸いです。

末尾とはなりますが、前回コメントを頂いたノエルさん、ありがとうございました。


次回はインタフェースや抽象クラスなどについてまとめようかと考えています。