2017-06-24 8 views
1

Ich bin mir nicht sicher, was die Unterschiede zwischen den beiden Codebeispielen unten sind. (Die erste Probe verwendet Picture.java vom standard library):Wie werden Werte in Array-Methoden gespeichert?


//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() 

output: 0 < == Änderungen in variable currentPixel ändert den Wert in pixelarray [0], ohne explizite Angabe.


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

output: 1 < == Änderungen in dem variablen firstelement Wert nicht in dem Array ändern [0]


Warum wird der erste Codebeispiel Ausgang 0 anstelle von 255, und warum gibt das zweite Codebeispiel 1 anstelle von 9 aus?

+0

Der zweite arbeitet mit einem primitiven Wert, der erste mit einem * Referenz * -Typ. –

+0

Danke für die schnelle Antwort. Ich verstehe, was Sie sagen, aber nicht genug, um auf den Unterschied im Code hinzuweisen, wenn ich dazu aufgefordert würde. Hat es mit der Pixel-Klasse zu tun und der Tatsache, dass ich Methoden verwenden muss? – Halcykon

+0

Grundsätzlich ja. Ein "int" ist eine feste 32-Bit-Größe, ein Referenztyp ist ein beliebiges "Objekt" (oder eine Unterklasse, einschließlich "Pixel"). –

Antwort

3

currentPixel ist ein Verweis auf pixelArray[0], keine Kopie (dh sie zeigen auf das gleiche Objekt). Auf der anderen Seite ist firstElement eine Kopie von array[0]. In den meisten Fällen, wenn Sie ein Objekt einer Variablen zuweisen, wird es eher eine Referenz als eine Kopie sein. Wenn Sie ein neues Pixel wollen, müssen Sie eines erstellen, indem Sie den Konstruktor aufrufen.

3

Die erste führt das Objekt herum, eine Instanz von Pixel. Dies geschieht unter dem Deckblatt, indem die Adresse des Objekts im Speicher verwendet wird. Daher wird alles, was Sie mit dem Objekt tun, mit dem Objekt und nicht mit einer Kopie des Objekts ausgeführt. Dies wird "durch Bezugnahme" genannt.

Im zweiten Beispiel int firstElement = array [0]; nimmt den Wert am Speicherplatz von array [0] und kopiert ihn an Ihren neuen Speicherort firstElement. Die zwei sind nicht der gleiche Ort im Speicher, also wenn Sie firstElement aktualisieren, aktualisieren Sie Array [0] NICHT. Dies wird "nach Wert" genannt.

EDIT:

Um Ihre Frage zu beantworten: Es gibt nicht so etwas wie eine Array-Methode.

Was Sie bekommen, ist ein 'Array-Offset'.

Ein Array ist ein linearer Speicherabschnitt. Es wird in gleiche Größen aufgeteilt, um die Werte zu verarbeiten, die Sie anfragen (4 Byte für 32-Bit-Ganzzahl, 2 Byte für eine 16-Bit-Ganzzahl, 1 Byte für ein Zeichen, usw.). Adressen waren früher 32-Bit, jetzt 64-Bit. Wenn also die Objekte array [0] referenziert werden, ist die Basis des Speicher-Chunk-Arrays [1] die Basis + sizeof (int) und so weiter.

+0

Okay, lass uns sehen, ob ich das klar verstehe ... Das neue Bild ist eine Instanz und die Instanzvariablen, die sich auf Picture beziehen, sind mypic, pixelArray und currentPixel. Also alles, was mit der Picture-Instanz verknüpft ist, ist eine Referenz? (Ich bin mir nicht sicher, wie pixelArray und currentPixel Instanzen und keine Instanzvariablen sind) – Halcykon

Verwandte Themen