プロが教える店舗&オフィスのセキュリティ対策術

JavaでC言語のようにポインタを使おうとしたらJavaには
ポインタが表面上はサポートされていないことを知りました。

関数を呼び出した際に、呼び出し元の変数に影響を与えるようなプログラムは
Javaで作れるのでしょうか?
例えば、以下のプログラムはCで関数を呼び出した際に呼び出し元の
変数の中身を関数内で書き換えてしまうプログラムです。
こういうことをJavaでするにはどう書けばよいのでしょうか?
もしこういうことができないのであれば、Javaにはポインタに代わるやりかたがあるのでしょうか?

実行結果:
1 10

#include <stdio.h>

void func( int *n ){
  *n = 10;
}

int main(){
  int n = 1;
  printf("%d ", n );
  func( &n );
  printf("%d ", n );
}

A 回答 (5件)

質問のコードを書き直すと


private void func(Integer n){
  n = 10;
}

public static void main(String[] args){
  Integer n = 1;
  System.out.printf("%d ", n );
  func( n );
  System.out.printf("%d ", n );
}

Javaのプリミティブ型にはそれぞれをラップした型があります。
int Integer
long Long
short Short
double Double
float Float
byte Byte
char Character
boolean Boolean
    • good
    • 0
この回答へのお礼

皆様ありがとうございました。

お礼日時:2007/08/13 17:05

Integerはイミュータブルなので、元の質問の「呼び出し元の変数に影響を与える」ケースに当てはまらないと思います。

    • good
    • 1

MyIntegerなど作らなくても、標準でInteger型がありますし、


こちらの方がJava5移行ならボクシングもできます。
    • good
    • 2

> Javaでは、基本的にオブジェクトはすべて参照渡しです。



よく誤解されるところですが、Javaにおける呼び出し規約では
常に call by value です。

Does Java pass by reference or pass by value? - Java World
http://www.javaworld.com/javaworld/javaqa/2000-0 …
call by reference : Java Glossary
http://mindprod.com/jgloss/callbyreference.html

等に記載されているとおりです。

仮にcall by referenceであるならば、引数として
渡したオブジェクト「そのもの」を変えることができなければ
なりませんが、現状のJavaはそうではありません。つまりは

"Java manipulates objects 'by reference,' but it passes object references to methods 'by value.'"

ということです。
    • good
    • 0

Javaでは、基本的にオブジェクトはすべて参照渡しです。

したがって、

>関数を呼び出した際に、呼び出し元の変数に影響を与えるようなプログラムは
>Javaで作れるのでしょうか?

オブジェクトを引数に渡すメソッドは、基本的にすべてそうなりますよ。要するに、引数でオブジェクトを渡せば、すべて呼び出し元のオブジェクトも変わります。ただし、プリミティブタイプのintなどはそうなりません。ですから、そうしたオブジェクトを用意すればできます。

例えば、以下のようなプログラムを実行すると、1回目に[int:1]、2回目に[int:10]となります。funcで変数numの状態に影響を与えていることがわかるはずです。

public class TestApp {

public static void main(String[] args) {
MyInteger num = new MyInteger(1);
System.out.println(num);
func(num);
System.out.println(num);
}

public static void func(MyInteger n){
n.setInteger(10);
}

}

class MyInteger {
private int n;

public MyInteger(int n){
this.n = n;
}

public int getInteger() {
return n;
}

public void setInteger(int n) {
this.n = n;
}

public String toString(){
return "[int:" + this.getInteger() + "]";
}
}

実行結果
[int:1]
[int:10]
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!