Objectreferenz statt value an Methode uebergeben?

Joefish

Neues Mitglied
Hallo,
Es handelt sich um folgenden Code:
[Java=42]package ch02;

import java.util.Scanner;

public class Tictactoe {
public static void main(String args[]){
char[][] field;
int FIELD_WIDTH, FIELD_HEIGHT, input;
Scanner scanner = new Scanner(System.in);

System.out.printf("Enter Field-Dimension:\nWidth: ");
FIELD_WIDTH = scanner.nextInt();
System.out.printf("Height: ");
FIELD_HEIGHT = scanner.nextInt();
field = new char[FIELD_HEIGHT][FIELD_WIDTH];

for(int i = 0; i < FIELD_HEIGHT; i++){
for(int j = 0; j < FIELD_WIDTH; j++){
field[j] = ' ';
}
}

field_print(field);
do{
input = scanner.nextInt();
if(input < FIELD_WIDTH && input >= 0)
field_add(input, field);
field_print(field);

}while(input != -1);

}

public static void field_print(char[][] field){
int width = field[0].length;
int height = field.length;

for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
System.out.printf("|%c",field[j]);
}
System.out.println("|");
}
for(int i = 0; i < (width*2+1); i++)
System.out.printf("=");
System.out.println();
for(int i = 0; i < width; i++)
System.out.printf("|%d",i);
System.out.printf("|\nEnter slot: ");
}

public static void field_add(int input, char[][] field){

for(int i = field.length-1;i >= 0;i--)
if(field[input] == ' '){
field[input] = 'X';
break;
}
}
}
[/Java]
Meine Frage bezieht sich auf Codeabschnitt 65-71 und die dort aufgerufene Funktion field_add.

Das Programm erstellt ein Feld mit FIELD_WIDTH x FIELD_HEIGHT, welches durch field_print gezeichnet wird.
field_add dient dazu in eine angegebene Reihe ein 'X' zu schreiben.
In Zeile 68 werden die Werte input und field and field_add uebergeben, oder so dachte ich zumindest.
Ich dachte, dass bei Funktionen IMMER Variablen by value uebergeben werden. Jedoch haette das in
main initialisierte Array field[][] sich nicht aendern duerfen, was durch Zeile 69 widerlegt wird.

Werden bei Referenztypen, welche als Funktionsparameter angegeben wurden, deren Referenz kopiert?
Falls ja, kann dies beeinflusst werden, sodass die Wert des Strings/Arrays.. uebergeben wird?
 
Werden bei Referenztypen, welche als Funktionsparameter angegeben wurden, deren Referenz kopiert?
Ja.
Falls ja, kann dies beeinflusst werden, sodass die Wert des Strings/Arrays.. uebergeben wird?

Nicht direkt. Man muss schon manuell eine Kopie erstellen. Bei 1D-Arrays tut's da ein
method(array.clone());
aber bei 2D muss man sich eine Methode dafür schreiben (sonst wären die INNEREN Arrays auch wieder dieSELBEN wie die, die in der main erstellt werden).


EDIT: Äh... das wird doch ein "Vier Gewinnt", oder? 🙂
 
Vielen Dank fuer deine Antwort Marco.
In meinem Buch wurden Referenztypen etwas komisch erklaert und scheine dabei gleich clone() mitueberlesen zu haben.
Aber in diesem Falle bin ich ja froh, dass die Referenz uebergeben wird.

Ganz recht, das wird ein Vier Gewinnt.
Ich dachte nachdem ich die ersten 200 Seiten meines Buches gelesen hatte, kann ich mich an die typischen Einsteigerprojekte wagen. 😀
 

Zurück
Oben