Let's Re⇒move -40ページ目

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")