• ベストアンサー

Javaでポインタ的なことはできるか?

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 ); }

質問者が選んだベストアンサー

  • ベストアンサー
  • luckymako
  • ベストアンサー率55% (29/52)
回答No.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

amazontester
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • kztk
  • ベストアンサー率53% (59/110)
回答No.4

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

すると、全ての回答が全文表示されます。
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

MyIntegerなど作らなくても、標準でInteger型がありますし、 こちらの方がJava5移行ならボクシングもできます。

すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> Javaでは、基本的にオブジェクトはすべて参照渡しです。 よく誤解されるところですが、Javaにおける呼び出し規約では 常に call by value です。 Does Java pass by reference or pass by value? - Java World http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html 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.'" ということです。

すると、全ての回答が全文表示されます。
noname#49664
noname#49664
回答No.1

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]

すると、全ての回答が全文表示されます。

関連するQ&A