Javaの授業 16 [ クラスとオブジェクト その5 ]
復習と確認。
【 サンプル 1 】
-------------
Test1.java
-----------------------------
public class Test1 {
private int param;
public void setParam(int param) {
this.param = param;
}
public int getParam() {
return param;
}
}
-----------------------------
Test2.java
-----------------------------
public class Test2 {
private Test1 test1;
public Test2(Test1 test1) {
this.test1 = test1;
}
public void setTest1(Test1 test1) {
this.test1 = test1;
}
public Test1 getTest1() {
return test1;
}
}
------------------------------
Execute.java(実行ファイル)
---------------------------------------
public class Execute {
public static void main(String[] args) {
Test1 test1_1 = new Test1(); //①
test1_1.setParam(100); //②
Test2 test2 = new Test2(test1_1); //③
Test1 test1_2 = test2.getTest1(); //④
System.out.println(test1_2.getParam()); //⑤
}
}
-------------------------------------------------
① Test1型の変数test1_1の宣言。→インスタンス①作成。
コンストラクタ確認。フィールドint param = 参照先なし。
② test1_1をsetParam(100)で実行。
インスタンス① param = 100 に書き換え
③ Test2型の変数test2を宣言。→インスタンス②作成。
コンストラクタ確認。(引数はTest1型の変数test1_1)
フィールド[test1] = test1_1→参照先はインスタンス①
④ Test1型の変数test1_2を宣言。test2.getParam()を代入。
test2の参照先はインスタンス① →param = 100
⑤ test1_2のparamを表示。 →100
------------------------------------------------
【 サンプル2(読んでみる)】
---------------------------------
Test1.java
---------------------------------
public class Test1 {
private int param1;
public Test1() {
param1 = 100;
}
public int getParam1() {
return param1;
}
}
----------------------------------
Test2.java
----------------------------------
public class Test2 {
private int param2;
public Test2() {
param2 = 200;
}
public int getParam2() {
return param2;
}
}
----------------------------------
Test3.java
----------------------------------
public class Test3 {
private Test1 test1;
private Test2 test2;
public void setTest1(Test1 test1) {
this.test1 = test1;
}
public Test1 getTest1() {
return test1;
}
public void setTest2(Test2 test2) {
this.test2 = test2;
}
public Test2 getTest2() {
return test2;
}
}
----------------------------------
Execute.java
----------------------------------
public class Execute {
public static void main(String[] args) {
Test1 test1 = new Test1();
Test2 test2 = new Test2();
Test3 test3 = new Test3();
test3.setTest1(test1);
test3.setTest2(test2);
display(test3);
}
public static void display(Test3 test3) {
Test1 test1 = test3.getTest1();
Test2 test2 = test3.getTest2();
System.out.println(test1.getParam1());
System.out.println(test2.getParam2());
}
}
----------------------------------
※参照先を常に確認。
【 サンプル3 】
問題:Test3のフィールド[b]の値を表示できるよう書き換える
----------------------------------------------------
Test1.java
----------------------------------------
public class Test1 {
private Test2 test2;
public Test1() {
System.out.println("Test1コンストラクタ実行");
test2 = new Test2();
}
}
----------------------------------------
Test2.java
----------------------------------------
public class Test2 {
private Test3 test3;
public Test2() {
System.out.println("Test2コンストラクタ実行");
this.test3 = new Test3();
}
}
----------------------------------------
Test3.java
----------------------------------------
public class Test3 {
private int b;
public Test3() {
System.out.println("Test3コンストラクタ実行");
b = 100;
}
}
----------------------------------------
Execute.java
----------------------------------------
public class Execute {
public static void main(String[] args) {
System.out.println("開始");
Test1 test1 = new Test1();
System.out.println("終了");
}
}
-----------------------------------
解答:Test1,2,3にメソッド[ゲッター]を追加
Executeに結果の取得と表示を追加。
-----------------------------------
Test1.javaに追加
----------------------
public Test2 getTest2() {
return test2;
}
----------------------
Test2.javaに追加
----------------------
public Test3 getTest3() {
return test3;
}
----------------
Test3.javaに追加
----------------
public int getB() {
return b;
}
---------------------------
Execute.javaに追加
---------------------------
Test2 test2 = test1.getTest2();
Test3 test3 = test2.getTest3();
int result = test3.setB();
System.out.println(result);
----------------------------------------------
※メソッドチェーン(javaでは上記3行をまとめて表記可)
int result = test1.getTest2().getTest3().getB();
----------------------------------------------
【 サンプル4 】読んでみる
----------------------
Test1.java
--------------------------
public class Test1 {
private int data;
public void setData(int data) {
this.data = data;
}
public int getData() {
return data;
}
}
--------------------------
Execute.java
---------------------------------------------
public class Execute {
public static void main(String[] args) {
Test1[] array = null;
array = createArray();
setTest1Instance(array);
setArrayData(array);
displayArrayData(array);
}
public static Test1[] createArray() {
Test1[] array = new Test1[3];
return array;
}
public static void setTest1Instance(Test1[] array) {
for(int i = 0; i < array.length; i++) {
array[i] = new Test1();
}
}
public static void setArrayData(Test1[] array) {
for(int i = 0; i < array.length; i++) {
array[i].setData((i + 1) * 100);
}
}
public static void displayArrayData(Test1[] array) {
for(int i = 0; i < array.length; i++) {
System.out.println(array[i].getData());
}
}
}
--------------------------------------------
Javaの授業 15 [ 修飾子 publicとprivate ]
public と private
・デスクトップにフォルダ作成。
Execute.javaを新規作成。
--------------------------------------------
public class Execute {
public static void main(String[] args){
Test1 test1 = new Test1();
//内容は後で書きます。
}
}
---------------------------------------------
Test1.javaを新規作成。
---------------------------------------------
public class Test1 {
public int a;^ //public
private int b;^ //private
public Test1() {
this.a = 100;
this.b = 200;
}
//public
public void display1() {
System.out.println(a + b);
}
//private
private void display2() {
System.outprintln(a + b);
}
//public
public void display3() {
display2();
}
}
----------------------------
コマンドプロンプトでの実行方法
----------------------------
① -->javac Test1.java
-->javac Execute.java
-->java Execute
② -->javac Test1.java Execute.java
-->java Execute
③ -->javac *.java ←フォルダ内のjavaファイルを全てコンパイル
-->java Execute
---------------------------------------------
Execute.javaに追記。①
---------------------------------------------
Test1.display1();
---------------------------------------------
→コンパイルOK
---------------------------------------------
Execute.javaに追記。②
---------------------------------------------
Test1.display2();
---------------------------------------------
→display2()はprivateな為エラー。
---------------------------------------------
Execute.javaに追記。 ③
---------------------------------------------
Test1.display3();
---------------------------------------------
→コンパイルOK
---------------------------------------------
Execute.javaに追記。 ④
---------------------------------------------
test1.a = 100;
test1.b = 100;
test1.display1();
---------------------------------------------
→b がprivateな為エラー。
b は Test1 で private アクセスされます。
---------------------------------------------
セッターとゲッター。(private にアクセスできるようにするメソッド。)
Test1に以下のメソッドを追記すれば外部からbの置き換えが可能。
-------------------------------------
//セッター
public void setB(int b) {
this.b = b;
}
//ゲッター(今回は不要 bの値を呼び出すのに使用)
public int getB() {
return b;
}
-------------------------------------
この時の、Execute.javaの追記
-------------------------------------
test1.a = 100;
test1.setB(100);
test1.display(1);
-------------------------------------
Javaの授業 14 [ クラスとオブジェクト その4 ]
例 :クラスの中にクラス
---------------------------------------------
Class4_1.java
---------------------------------------------
class Class4_1 {
Class4_2 obj;
Class4_1(boolean flg) {
if(flg) {
obj = new Class4_2();
}
}
Class4_1(int a, String b) {
obj = new Class4_2(a,b);
}
}
--------------------------------------------
Class4_2.java
--------------------------------------------
class Class4_2 {
int a;
String b;
Class4_2() {
a = 0;
b = "無し";
}
Class4_2(int a, String b) {
this.a = a;
this.b = b;
}
void method4() {
System.out.println("aの値は = " + a + " bの値は = " + b);
}
}
--------------------------------------------
Execute.java
--------------------------------------------
class Execute {
public static void main(String[] args) {
Class4_1 obj1 = new Class4_1(true); //①
Class4_1 obj2 = new Class4_1(false); //②
Class4_1 obj3 = new Class4_1(100, "main"); //③
obj2.obj = new Class4_2(200, "main2"); //④
obj1.obj.method4();
obj2.obj.method4();
obj3.obj.method4();
}
}
--------------------------------------------
Executeから順を追って見る。
① Class4_1 obj1 = new Class4_1(ture); →obj1 = インスタンス①
Class4_1型の変数obj →インスタンスを作成
型[Class4_1]、引数[boolian]のコンストラクタを確認
Class4_1(boolean flg) {
if(flg) {
obj = new Class4_2(); →インスタンス① obj = インスタンス②
}
flgにtrueを代入。→新たにインスタンスを作成。
型[Class4_2]、引数()のコンストラクタを確認。
Class4_2() {
a = 0;
b = "無し"; →インスタンス② a = 0
} b= "無し"
この段階で obj1 は a = 0;
b = "無し";
②Class4_1 obj2 = new Class4_1(false); obj2 = インスタンス③
上記と同じ型、引数。
flgに代入されるのがfalseの為何も行わない。→インスタンス③ obj = null
③Class4_1 obj3 = new Class4_1(100, "main"); obj3 = インスタンス④
型[Class4]、引数(int,String)のコンストラクタを確認
Class4_1(int a, String b) {
obj = new Class4_2(a,b); →インスタンス④ obj = インスタンス⑤
}
(int a,String b)に(100,"main")を代入。
型[Class4_2]、引数(int,String)のコンストラクタを確認
Class4_2(int a, String b) {
this.a = a;
this.b = b;
}
(int a,String b)に(100,"main")を代入。→インスタンス⑤ a = 100
this.a = 100 b = "main"
this.b = "main"
④obj2.obj = new Class4_2(200, "main2"); →obj2.obj = インスタンス⑥
obj2.objを確認。→obj = null (インスタンス③から⑥へ参照先変更)
型[Class4_2]、引数(int,String)のコンストラクタ確認(上記)
(int a,String b)に(200,"main2")を代入。→インスタンス⑥ a = 200
this.a = 200 b = "main2"
this.b ="main2"
obj1~3のa,bの値を表示するメソッドmethod4を実行。
obj1.obj.method4(); →obj1 →インスタンス②(a = 0 , b ="無し")
obj2.obj.method4(); →obj2 →インスタンス⑥(a = 200 , b = "main2")
obj3.obj.method4(); →obj3 →インスタンス④.obj→インスタンス⑤(a = 100 , b = "main")