
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 );
}
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
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-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.'"
ということです。

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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
式の型は配列型で int に解決済...
-
三目並べ(Tick-Tack-Toe)をJav...
-
c# デリゲート関連の命名について
-
double型からint型へのキャスト...
-
C#で実行時にメソッドの返り値...
-
java 長さの異なる配列の代入
-
javaでカレンダー作成
-
DataSet(DataTable)の使い方
-
ある年月の月間日数を取得する...
-
javaのRandomで『a~z』までの...
-
メインが含まれていません
-
IN演算子の中身を動的に生成
-
C言語からJavaに書き換えの質...
-
JAVA エラー 式の開始が不正で...
-
Javaでポインタ的なことはでき...
-
System.err. printlnとSystem.o...
-
C言語のポインターに関する警告
-
1~100までの数字を表示し、か...
-
JSPやサーブレットでSystem.out...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
メインが含まれていません
-
式の型は配列型で int に解決済...
-
Java 初心者 int型の取り扱い方
-
(Swing)JTextFieldを半角のみ入...
-
DataSet(DataTable)の使い方
-
javaでカレンダー作成
-
intが負の時に投げる例外はあり...
-
C#で実行時にメソッドの返り値...
-
JUnit4のアノテーションについて
-
6桁の数字を重複なしでランダム...
-
JAVA エラー 式の開始が不正で...
-
java spring でエラーが出て困...
-
C#でバブルソート
-
プログラムの作り方
-
全組み合わせの出力
-
SwingでJtableのヘッダ行が表示...
-
アンマネージDLLで、ダイアログ...
-
c# デリゲート関連の命名について
-
複数のボタンを配置し、それぞ...
おすすめ情報