※以下の方法を行っても、x=5にはなりません。それはクラスBの保存の問題とは別の問題になります。(最後に補足しました)
B b;
これだけでは、クラスBを入れることのできる箱(変数)を用意したにすぎません。
この中身は空っぽで、クラスBの本体、インスタンスは入っていません。
その為そのままでは、何もすることはできません。
B b = new B
とすることで初めてクラスBの実体が作り出されて、b
の箱に収まります(実際には参照ですが)。
new
はただ初期化するためのものではなく、それ自体を作り出すものなので、
それを行わなければ、クラス(インスタンス)は使えません。(クラスメソッドとかは別)
初期化せずに使いたい。という事の意味をもう少し考える必要があります。
「初期化せずに」という事は、「既にあるものをそのまま使って」という事だと思いますが、
そうであれば、その「既にあるもの」を渡せばよいです。
例えば、クラスAのフィールドとして、既存のクラスBの情報を保持したいのであれば、
既存のクラスBのインスタンスが有効な場所から、クラスAのフィールとにその値をセットすればよいです。
java
1 public static void main(String args[]) {
2 int x = 3;
3
4 A a = new A();
5 B b = new B();
6 a.b = b; // bのインスタンスへの参照をaのフィールドに設定する
7
8 b.B2_Method();
9
10 System.out.println(a.A_Method(x));
11 }
ただし、この方法は、うっかりセットするのと忘れたり、
セットする前に、A_Method()
が呼ばれてしまうと、ヌル参照で落ちてしまいます。
クラスBの情報を、クラスA全体で使うのであれば、
クラスAのコンストラクタの引数にクラスBを指定して、クラスAが存在している間は
必ずどこかのクラスBとリンクするようにする必要があります。
JAVA
1class A {
2 private B b; // 勝手に書き換えられないように
3
4 public A(B b){
5 this.b = b; //コンストラクタでbをフィールドに格納
6 }
7
8 int A_Method(int x) {
9 if(b.y == 1) {
10 b.B1_Method(x);
11 return x;
12 }
13 return -1;
14 }
15}
16
17//main必要な部分だけ
18
19 public static void main(String args[]) {
20 B b = new B(); // 先にbを作っておかないと渡せないので
21 A a = new A(b); // bを渡してaを生成する
22 }
もしくは、クラスBの情報を使うのが、A_Methodの中だけであるなら、A_Methodの引数に
クラスBを指定するという手もあります。
JAVA
1class A {
2 int A_Method(B b,int x) {
3 if(b.y == 1) {
4 b.B1_Method(x);
5 return x;
6 }
7 return -1;
8 }
9}
10
11//main必要な部分だけ
12
13 public static void main(String args[]) {
14 System.out.println(a.A_Method(b,x));
15 }
x = 5
にならないのは、x+=2
を行っている場所でのx
とは、
B1_Method(int x)
という風に定義された仮引数なので、そのメソッドの内部でしか有効ではないからです。
メソッドの中で3+2
は確かに行われますが、メソッドの終了と共にその結果はそのまま消えてなくなります。
それを外部に伝えたい場合は、消えない場所の変数に保存するか、返り値等で伝える必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。