Javaの授業 13 [ クラスフィールドとクラスメソッド ]
クラスフィールドとクラスメソッド
※キーワード 【 static 】
[特徴]
・インスタンス化せずに実行できる。
(new ではなく、宣言した時点でクラスフィールドを1つ持つ。)
・インスタンスの数に関わらず常に実体(フィールド)は1つ。
-----------------------------------
public class Test{
public static int a = 0;
public static void test(){
}
}
-----------------------------------
Test t1 = new Test();
Test t2 = new Test();
t1.a = 10;
t2.a = t1.a + 10;
System.out.println(t1.a);
System.out.println(t2.a);
--------------------------
これまでであれば
[t1]という変数と[t2]という変数は別々のフィールドを持っていた。
※変数が出てきたら必ず型を確認。
今回は[static]な変数しか持たない型の為、各インスタンスはフィールドを持たない。
→[t1.a]と[t2.a]は同じ型[Test]のクラスフィールドを参照する。
結果、最終表示されるのは
20
20
となる。
【参考】public static main(String[] args){}
の場合も、[static]の為、インスタンス化なしで実行可。
練習 Class5.java
----------------------------------
Class5.java
----------------------------------
class Class5 {
static int count1 = 0;
int count2;
void countUp1() {
count1++;
}
void countUp2() {
count2++;
}
void method5() {
System.out.println("count1の値は = " + count1 + "count2の値は = " + count2);
}
}
----------------------------------
Execute.java
------------------------------------------------
class Execute {
public static void main(String[] args) {
Class5 obj1 = new Class5();
Class5 obj2 = new Class5();
for(int i = 0; i < 5; i++) { //i=0,1,2,3,4
obj1.countUp1(); //Class5.count1=1,2,3,4,5
obj1.countUp2(); //obj1=1,2,3,4,5
}
for(int j = 0; j < 10; j++) {//j=0,1,2,3,4,5,6,7,8,9
obj2.countUp1(); //Class5.count1=6,7,8,9,10,11,12,13,14,15
obj2.countUp2(); //obj2=1,2,3,4,5,6,7,8,9,10
}
obj1.method5(); //count1=15 count2=5
obj2.method5(); //count1=15 count2=10
}
}
------------------------------------------------
個人的感想
[Class5]という型が
[count1]というクラスフィールドと
[count2]という(インスタンス)フィールドを持つ
という理解がはじめにできればすんなりいったかも。
明日はもう少し複雑になります。とのこと。
Javaの授業 12 [ クラスとオブジェクト その3 ]
例:Class2 コンストラクタ、セッター、ゲッター
--------------------------------------
Class2.java
-------------------------------------
class Class2 {
private String s;
//コンストラクタ:引数無し
Class2() {
s = "無し";
}
///コンストラクタ:引数有り
Class2(String s) {
this.s = s;
}
//セットメソッド
void setS(String s) {
this.s = s;
}
//ゲットメソッド
String getS() {
return s;
}
}
-------------------------------------
Execute.java
-------------------------------------------------
class Execute {
public static void main(String[] args) {
Class2 obj1 = new Class2();
// Class2型のインスタンス[obj1]を作成。
// 引数なしのコンストラクタをClass2.javaより参照。
// obj1 = [s="無し"] ←インスタンス①
Class2 obj2 = new Class2("有り");
// Class2型のインスタンス[obj2]を作成。
// 引数がStringのコンストラクタをClass2.javaで確認。
// obj2 = [s="有り"] ←インスタンス②
System.out.println(obj1.getS());
//obj1のgetS()メソッドの実行結果を表示する。
//obj1の参照するインスタンス①は[s="無し"]
//"無し"を表示。
System.out.println(obj2.getS());
//obj2のgetS()メソッド実行
//obj2の参照するインスタンス②は[s="有り"]
//"有り"を表示。
obj1.setS("test1");
//obj1をSetSメソッド実行(引数"test1")
//SetS → 呼び出されたsを引数sに書き換えるメソッド。
// → obj1のs["無し"]を["test1"]に書き換え。
// obj = ["test1"] ←インスタンス①
obj2.setS("test2");
//(略)
System.out.println(obj1.getS());
//この時点でのobj1のgetS()メソッドの実行結果を表示
//インスタンス①の状態は["test1"]
//"test1"を表示。
System.out.println(obj2.getS());
//(略)
}
}
-------------------------------------------------
例:Class3 (※インスタンスの数と内容に注意)
--------------------------------------------
Class3.java
------------------------------
class Class3 {
private String s;
Class3() {
s = "class3";
}
// ※引数なしのコンストラクタ1個のみ。
void setS(String s) {
this.s = s;
}
String getS() {
return s;
}
}
------------------------------
Execute.java
-------------------------------------------------
class Execute {
public static void main(String[] args) {
Class3 obj = new Class3();
//obj = インスタンス① →s="class3"
System.out.println(obj.getS());
//objのgetSメソッドの実行結果の表示
//"class3"を表示
change1(obj);
//引数objでchange1メソッドの実行。
//※新たなインスタンスが作成されるが
// 既出のobjのインスタンスの上書きなし。
//obj = インスタンス① →s="class3"のまま
System.out.println(obj.getS());
//objのsの値を表示
//"class3"を表示
change2(obj);
//引数objでchange1メソッドの実行。
//引数のインスタンスが書き換えられる。
//obj = インスタンス① →s="class3"からs="change2"に書き換え。
System.out.println(obj.getS());
//objのsの値を表示
//"change2"を表示
}
//※Class3型の変数objを引数に持つメソッドchange1、change2
public static void change1(Class3 obj) {
obj = new Class3();
//新たにClass3型のインスタンス[obj]作成
//change1:obj →インスタンス②→s="引数の(Class3 obj)"
obj.setS("change1");
//change1:objをsetSメソッドに引数"change1"で実行
//change1:obj →インスタンス②→s="change1"に書き換え
}
public static void change2(Class3 obj) {
obj.setS("change2");
//[引数のobj]をsetSメソッドに引数"change2"で実行
//[引数のobj]→[引数のobj]の参照するインスタンス
// →s="change2"に書き換え
}
}
-------------------------------------------------
Javaの授業 11 [ クラスとオブジェクト その2 ]
フィールドとメソッドを持ったクラスの作成
フィールドやメソッドには目的に対応した、
何のための変数やメソッドなのかといったことがわかりやすい名前がよい
ただし、変数名そのものに意味はない。
あくまで人が見てわかりやすいかどうかだけ
クラス作成時にはクラスの目的や役割といったものを考えて作るとつくりやすい。
このクラスの目的や役割としては名前と年齢を保持でき、名前・年齢の代入や表示を行えるものとして考えている
例
-------------------------
Nameage.java と Execute.java
-------------------------
Nameage.java
-------------
public class NameAge {
// 名前を持たせるため、String型でnameという変数を宣言
String name;
// 年齢を持たせるため、int型でageという変数を宣言
int age;
// フィールドのデータを表示するためのメソッド
public void show(){
System.out.println(name + "の年齢は"+age+"歳");
}
// フィールドにデータをセットするためのメソッド
public void setData(String inName, int inAge){
name = inName;
age = inAge;
}
}
//※ 今回はコンストラクタがない。自動的に
// Nameage(){
//}
//引数なし、内容なしのコンストラクタ実行でインスタンス化される。
-----------------------------------
Execute.java
-----------------------------------
// NameAgeを実際に利用する実行クラス
//
// 実行結果(例):
// NameAge@12b6651
※メモリの番地
// 山田 太郎の年齢は23歳
// 山田 花子の年齢は28歳
//
// @以降の数値は実行環境によって変化する
public class Execute {
public static void main(String[] args){
// 自作したNameAgeクラスを型として使い、nameAgeという変数を宣言し、
//インスタンスを生成している。
NameAge nameAge = new NameAge();
// nameAgeが持つデータの実体を示す番地の出力
System.out.println(nameAge);
// フィールドに直接値を入れる
nameAge.name = "山田 太郎";
nameAge.age = 23;
// showメソッドを実行しnameAgeという変数が持っているインスタンスの値を表示
nameAge.show();
// メソッドを利用して値を入れる場合
nameAge.setData("山田 花子",28);
//( ※nameAgeに対応したインスタンスの書き換えが行われる )
// showメソッドを実行しnameAgeという変数が持っているインスタンスの値を表示
nameAge.show();
}
}