渡されたデータの加工

 

慣れるまで分かりにくいものに、参照型値型というのがあります。
int や char が「値型」で、それ以外はだいたい「参照型」です。

毎度、管理人イガジーです。

「配列」は(int 配列でも)参照型になります。
このエントリの参考ソースでは、

int []a;
RoundRR(int []x) {
	a=x;

と、渡された配列をフィールド変数に代入しています。
このやり方は、好みが分かれるといいますか
「けしからん」とか「美しくないやり方」と思う人もいるでしょう。

a=x; とした後で、例えばa[0]=1; などとすると
x[0]にも1 が代入されます。
a も x も同じ実体(オブジェクト)を指しているからです。

class RoundRR は、渡された配列を直接更新する仕様になっています。
クラスというものは、独立性を持つべきだ(カプセル化するべきだ)
という考え方からすると、反則的な処理です。

渡されるx[]の内容を変更しないという仕様にするには
配列の中身をコピーして、dispa には 加工したa[]を
渡すようにする必要があるでしょう。
配列の中身をコピーする(コピーして別の実体を作る)には
a=x.clone(); を使います。
(c[]に中身をコピーするのに、c=x.clone();を使っています)

clone() した配列の値を変更しても、元の配列(x[])には
影響はありません。別の実体を指しているからです。

メソッドに渡すものが、配列ではなくて int などの値型の場合は
メソッド内でいくらその値を変更しても、元の値には影響は
ありません。例えば、
void func(int d) {
d=d+10;
}
というメソッドがあったとして、
int t=10;
func(t);
としても(func()内でd+10されても)t は10のままです。

と説明してみたものの、最初のうちはさっぱり分からないかもしれません。
たとえ、分からなくてもあせらずに、時間を置いてまた
読みなおしてみてください。そのうちわかってくると思います。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。