- PR -

メソッドの引数の参照渡しはできますか?

投稿者投稿内容
katsum
大ベテラン
会議室デビュー日: 2002/02/27
投稿数: 119
お住まい・勤務地: 東京都
投稿日時: 2002-03-14 17:35
言語仕様書を当たってみましたが、この点について書かれていないようなのでお尋ねします。
以下の C++ コードの3行目のように、参照渡しにする方法があれば教えてください。
Java コードでは8行目に相当します。

[C++]
01| #include <stdio.h>
02|
03| void setFalse(bool& b) // 参照渡し
04| {
05| b = false;
06| }
07|
08| void main(void)
09| {
10| bool b = true;
11| setFalse(b);
12| printf("%s\\n", b ? "true" : "false"); // false と表示される
13| }

[Java]
01| class foo {
02| static void main(String[] args) {
03| boolean b = true;
04| setFalse(b);
05| System.out.println(b); // true と表示される
06| }
07|
08| static void setFalse(boolean b) { // 参照渡しにしたい
09| b = false;
10| }
11| }
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-03-14 18:46
Javaではメソッドパラメタはすべて値渡しです。
toshi
会議室デビュー日: 2002/03/07
投稿数: 10
お住まい・勤務地: 東京
投稿日時: 2002-03-14 19:20
基本データ型を「参照渡し」したいということですか?

参照型(クラスのインスタンス)と違って基本データ型は「値渡し」なのです。

どうしても基本データ型をメソッド内部で変更したいということなら
基本データ型の配列にしてみましょう。。。

public class NewFoo {

public static void main(String[] args) {
boolean[] b = new boolean[1];
b[0] = true;
setFalse(b);
System.out.println(b[0]); // false と表示される

}

public static void setFalse(boolean[] b) {
b[0] = false;
}

}

解決になってないかぁ
TOTO
会議室デビュー日: 2002/03/12
投稿数: 1
投稿日時: 2002-03-14 19:21
Javaでは基本的に全て参照渡しです。
ただ、
booleanやintなどのプリミティブな型に限って値渡しになります。

booleanを参照渡しで使いたいのであれば
Booleanクラスを使えばよいのではないでしょうか。

class foo {
static void main(String[] args) {
Boolean b = new Boolean(true);

setFalse(b);
System.out.println(b); // true と表示される
}

static void setFalse(Boolean b) { // 参照渡しにしたい
b = new Boolean(false);
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-03-14 20:06
この例のBooleanだと無理ですね。booleanはプリミティブなので値渡しですし、オブジェクトのBooleanにしても受け取ったオブジェクトの内部を変えるメソッドがAPIに見当たらないので無理です。

ただし、自分でMyBooleanなどどオブジェクトを定義し、setFalse()などとすれば大丈夫です。TOTOさんの例ですと参照渡しにはなっていますが、あまり意味がないような・・・。(結局、参照先のオブジェクトはいじられてないため)

プリミティブ型(7つでしたっけ?)以外のものはすべてオブジェクトなので勝手に参照渡しになります。(ただし、String型などのimmuneなオブジェクトは要注意)どうしてもプリミティブを参照渡ししたいときには自分でオブジェクトを作らないとだめです。(APIを使用することも可ですが)
てくてく
会議室デビュー日: 2002/01/24
投稿数: 2
投稿日時: 2002-03-14 20:38
直接の回答にはなっていませんが…
言語仕様 8.4.1 Formal Parameters には以下の様に書かれています。

When the method or constructor is invoked (§15.12), the values of the actual argument expressions initialize newly created parameter variables, each of the declared Type, before execution of the body of the method or constructor.

参照型の変数には文字通りインスタンスへの参照が保持されます。
したがってメソッドの引数が参照型の場合には、呼出側の変数が
保持する参照値によってメソッド引数が初期化される(参照値が
引数にコピーされる)わけです。
このようにJavaではメソッドの引数は*値渡し*になります。

参照型の場合、見た目には参照渡しに見えますけどね。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-03-14 20:57
> このようにJavaではメソッドの引数は*値渡し*になります。

それを言うと、CもC++も同じですよ・・・。結局は参照先のアドレス(もしくはいわゆるポインタの持つ値)を「数値」として渡さなければいけないわけですから。
katsum
大ベテラン
会議室デビュー日: 2002/02/27
投稿数: 119
お住まい・勤務地: 東京都
投稿日時: 2002-03-14 21:12
たくさんのコメントありがとうございました。
プリミティブ型は参照渡し出来ないということですね。
そのことが確認できただけでも十分です。
どうもありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)