プログラミング自主学習 18日目 静的クラス・動的クラス/フィールドとメソッド/Class/Instance/Static
静的クラス・動的クラス
静的クラス
静的クラスとは、インスタンス化をせずに、主にメソッドを使用して使用されるクラスのことだ。
数学的演算や時間・日付などの処理などの機能が提供される。
例:Math
Math.PI;
Math.ceil(1.1);
動的クラス
動的クラスとは、インスタンス化を通して、必要なデーターを保持し、メソッドを呼び出すことができるクラスのことだ。同じクラスから複数のインスタンス(クラスの分身だと考えば良い)を制作することで、それぞれのインスタンスを独立して管理することができ、柔軟性を提供する。
例:FileWriter
FileWriter a1 = new FileWriter("text.txt");
a1.write("hello");
a1.close;
FileWriter a2 = new FileWriter("text2.txt");
a2.write("hello2");
a2.close;
フィールドとメソッド
以下のコードをメソッドを使用して、分かりやすくまとめてみる。
PrintA()とPrintB()というメソッドを作成し、複雑なコードを片付いてみた。
しかし、ここからPrintA()とPrintB()のメソッドの値を変更したいと仮定してみよう。
このように、パラメーターを使って対応することができる。
しかし、今は15行目にすぎないコードが一億行目のコードだと想像してみるとパラメーターを活用したとしても
パラメターを一行一行コピーしてペーストする非常に手間がかかるだろう。
その際に活用することがグローバル変数である。
Class
先ほどのメッソドをパラメーターやグローバル変数を活用し、まとめてみた。
しかし、複雑なコードの中で、1億行のメッソドがあると仮定してみる。
それぞれのメッソドに区別がつかないので、クラスを使用してもう一度まとめる必要がある。
新しく作成されたClass Printの変数(field)とメソッドをClass Printのメンバー(MEMBER)だという。
field:delimiter method:A(), B()
今はMyOPPというClassに二つのClassであるMyOPPとPrintが存在するが、Refactorを使用して、引っ越しすることもできる。
Instance
一つのClassであるMyOOPの状態を変更する必要があると仮定する。
18行目を見ると、Printクラスの変数delimiterを宣言し、新しい値に初期化を繰り返されていることが分かる。
このような問題を解決するためには、インスタンスを活用する。
1)インスタンスを作成する。
class MyApp
classname 変数名 = new classname();
例) Print p1 =new Print();
2)既存のクラスのStaticを除去する。これにより、ClassのメンバがInstanceのメンバーになる。
class Print
public class Print {
public static string delimiter = "";
public static void A(){
system.out.println(delimiter);
system.out.println("A");
system.out.println("A");
}
public static void B(){
system.out.println(delimiter);
system.out.println("B");
system.out.println("B");
}
}
3)作成したインスタンスより変数とメソッドを活用する。
class MyApp
Print p1 =new Print();
p1.delimiter = "----"
p1.A();
p1.A();
p1.B();
p1.B();
Print p2 = new Print();
p2.delimiter = "****"
p1.A();
p1.A();
p1.B();
p1.B();
p1.A();
p2.A();
p1.A();
p2.A();
<結果>
----
A
A
----
A
A
----
B
B
----
B
B
****
A
A
****
A
A
****
B
B
****
B
B
----
A
A
****
A
A
----
A
A
****
A
A
このように、インスタ化によりコードが整理され、柔軟性が向上した。
Static
① Staticがある場合Classはinstanceの変数にもメソッドにもアクセスできない。
② InstanceはClassの変数とメッソドを利用でき、Classの変数を直接変更することもできる。
③ Instanceはお互いに独立されているため、Instance f1の変数instanceVarとinstance f2の変数instanceVarは異なる存在である。
Discussion