2017-06-24 8 views
1

以下の2つのコードサンプルの違いはわかりません。 (最初のサンプルがstandard libraryからPicture.javaを使用):値は配列メソッドにどのように格納されますか?


//chooses a photo from your computer and reads RGB values from it 
Picture mypic = new Picture(FileChooser.pickAFile()); 
Pixel pixelArray [] = mypic.getPixels(); 
pixelArray[0].setRed(255); 
Pixel currentPixel = pixelArray[0]; 
currentPixel.setRed(0); 
pixelArray[0].getRed() 

出力:変数currentPixel 0 < ==変更は、明示的な宣言なし[0]画素アレイ内の値を変更します。


int array[] = new int[4]; 
array[0] = 1; 
int firstElement = array[0]; 
firstElement = 9; 
array[0] 

出力:変数firstElement 1つの < ==変化が配列に値を変更しない[0]


なぜ最初のコードのサンプル出力0の代わりに255、 2番目のコードサンプルが9の代わりに1を出力するのはなぜですか?

+0

2つ目はプリミティブ値で動作します。最初は*参照型です。 –

+0

速い応答に感謝します。私はあなたが何を言っているのか理解していますが、私に尋ねられたらコードの違いを指摘するのに十分ではありません。 Pixelクラスと、それにメソッドを使用する必要があるという事実とは関係がありますか? – Halcykon

+0

基本的にはい。 'int'は固定された32ビット量であり、参照型は' Object'(または 'Pixel'を含むサブクラス)です。 –

答えて

3

currentPixelは、pixelArray[0]への参照であり、コピーではありません(つまり、同じオブジェクトを指しています)。一方、firstElementarray[0]のコピーです。ほとんどの場合、オブジェクトを変数に代入すると、オブジェクトはコピーではなく参照になります。新しいPixelが必要な場合は、コンストラクタを呼び出して作成する必要があります。

3

最初のものは、ピクセルのインスタンスを周りにオブジェクトを渡しています。これは、メモリ内のオブジェクトのアドレスを使用してカバーの下で行われています。したがって、あなたがオブジェクトに行うことは、オブジェクトに行われ、オブジェクトのコピーではありません。これは '参照によって'と呼ばれます。

第2の例では、int firstElement = array [0];配列[0]のメモリ位置の値を取得し、それを新しいメモリ位置のfirstElementにコピーしています。 2つはメモリ内の同じ場所ではないので、firstElementを更新すると配列[0]は更新されません。これは「価値によって」と呼ばれます。

EDIT:

あなたの質問に答えるために:アレイ法のようなものはありません。

あなたが得ているものは、「配列オフセット」です。

アレイは、メモリの線形チャンクです。同じサイズに分割され、要求された値を処理します(32ビット整数の場合は4バイト、16ビット整数の場合は2バイト、charの場合は1バイトなど)。アドレスは以前は64ビットでしたが、以前は32ビットでした。したがって、オブジェクトarray [0]を参照するとき、メモリチャンク配列[1]の基底はbase + sizeof(int)です。

+0

さて、これを明確に理解しているかどうかを見てみましょう... 新しいPictureはインスタンスで、Pictureを参照するインスタンス変数はmypic、pixelArray、およびcurrentPixelです。 Pictureインスタンスに関連付けられているものは何ですか? (私はpixelArrayとcurrentPixelがインスタンス変数ではなくインスタンス変数ではないかどうかはわかりません) – Halcykon

関連する問題