Globale Variablen in Java?

Alles, was sonst nirgendwo reinpasst

Globale Variablen in Java?

Beitragvon Spobo » 18.11.07 16:19

Hi ich hab da mal ne Frage. Wie kann man in Java zb mit einer Funktion
verändereArray(array,posx,posy);
das array permanent verändern, ohne dass verändereArray eine Funktion ist. Gibt es in Java sowas wie globale variablen oder doch eine Möglichkeit, die Variablen global zu verändern und nicht nur im void?
Benutzeravatar
Spobo
 
Beiträge: 40
Registriert: 20.10.07 13:47

Re: Globale Variablen in Java?

Beitragvon fw » 18.11.07 16:32

Spobo hat geschrieben:mit einer Funktion verändereArray(array,posx,posy); (...)
ohne dass verändereArray eine Funktion ist

Was meinst du damit?

Spobo hat geschrieben:und nicht nur im void?

Und was soll "im void" heissen??

Ich vermute mal du willst die Daten ändern ohne sie komplett zu übergeben. Für sowas gibt es Call by Reference, d.h. du übergibst eine Referenz anstatt den kompletten Daten. Das wird bei Java in so einer Situation soweit ich mich erinnere sowieso gemacht... Globale Variablen sind, egal in welcher Sprache, bis auf Ausnahmesituationen fast immer eine schlechte Idee..
Benutzeravatar
fw
 
Beiträge: 1356
Registriert: 17.05.06 19:37
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: Mathe

Beitragvon oxygen » 18.11.07 16:40

Wenn du einen abstrakten Datentyp verwendest, handelt es sich automatisch um call-by-reference.
oxygen
 
Beiträge: 1054
Registriert: 16.12.05 23:05
Wohnort: Bergheim
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: Medizin

Beitragvon Coolcat » 18.11.07 17:04

Wenn du einen abstrakten Datentyp verwendest, handelt es sich automatisch um call-by-reference.

Fast richtig. :)
Java kann zunächst einmal nur Call-by-Value. Ein Objekt ist in Java aber immer nur eine Referenz. D.h. wenn du in Java ein Array (oder ein anderes Objekt) an eine Methode übergibst, wird eben diese Referenz mit Call-by-Value übergeben, nicht die Daten selbst.

Somit betreffen alle Änderungen am Array innerhalb der Methode das Array außerhalb. Ist dieses Verhalten nicht erwünscht, müssen die Daten vorher explizit kopiert werden. Also neues Array anlegen und mit einer Schleife die Elemente kopieren.

Beispiel:
Code: Alles auswählen
public static void methode(int[] b) {
   b[0] = 42;
}

public static void main(String[] args) {
   int[] a = new int[1];
   a[0] = 0;
   methode(a);
   System.out.println(a[0]); // a[0] == 42
}


Weißt du aber der Referenz innerhalb der Methode etwas anderes zu, ändert sich der Wert der Referenz außerhalb nicht.

Beispiel:
Code: Alles auswählen
public static void methode(int[] b) {
   b = new int[1];
   b[0] = 42;
}

public static void main(String[] args) {
   int[] a = new int[1];
   a[0] = 0;
   methode(a);
   System.out.println(a[0]); // a[0] == 0
}
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon Coolcat » 18.11.07 17:26

Noch mal ein Beispiel zu Call-by-Reference in C++:

Code: Alles auswählen
#include <iostream>

void function(int& b) {  // das '&' bewirkt call-by-reference!
   b = 42;
}

int main(int argc, char** args) {
   int a = 0;
   function(a);
   std::cout << a << "\n"; // Ausgabe: 42
   return 0;
}
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon mirko » 18.11.07 17:31

um nochmal auf die eigentlich frage zurückzukommen:

es gibt variablen, die innerhalb einer gesamten klasse oder theoretisch sogar von außerhalb zu sehen sind. dieses sind dann aber klassen-attribute und sollten nur verwendet werden, wenn du _wirklich_ objektorientiert programmierst.

für die aktuellen progra-aufgaben ist das nicht sinnvoll und würde mit sicherheit auch punktabzug wegen schlechten stils geben.
mirko
 
Beiträge: 1032
Registriert: 22.10.06 18:33
Studiert seit: WS 12/13

Beitragvon theTux » 18.11.07 18:14

mirko hat geschrieben:es gibt variablen, die innerhalb einer gesamten klasse oder theoretisch sogar von außerhalb zu sehen sind. dieses sind dann aber klassen-attribute und sollten nur verwendet werden, wenn du _wirklich_ objektorientiert programmierst.

Attribute der Klasse: ja.
Attribute, die außerhalb der Klasse sichtbar sind: nein.
Von außen sollte man möglichst nicht auf Attribute direkt zugreifen.
(Ausnahmen bestätigen natürlich die Regel...)

mirko hat geschrieben:für die aktuellen progra-aufgaben ist das nicht sinnvoll und würde mit sicherheit auch punktabzug wegen schlechten stils geben.

Da stimme ich voll zu. Wobei das mit dem Punktabzug wohl vom Einzelfall abhängt... Es sollte aber alles problemlos ohne gehen!
Stur lächeln und... oh, falscher Pinguin.
Benutzeravatar
theTux
 
Beiträge: 577
Registriert: 15.01.06 16:41

Beitragvon Spobo » 18.11.07 19:25

Java kann zunächst einmal nur Call-by-Value. Ein Objekt ist in Java aber immer nur eine Referenz. D.h. wenn du in Java ein Array (oder ein anderes Objekt) an eine Methode übergibst, wird eben diese Referenz mit Call-by-Value übergeben, nicht die Daten selbst.


ok sehr gut, dass wollte ich wissen, und das will ich auch so haben;). ok und jetzt nur aus neugier; wie siehts denn mit primitiven datentypen aus? gibt es da eine möglichkeit die referenz in einer anderen methode zu ändern?
Benutzeravatar
Spobo
 
Beiträge: 40
Registriert: 20.10.07 13:47

Beitragvon fw » 18.11.07 19:59

Spobo hat geschrieben:ok sehr gut, dass wollte ich wissen, und das will ich auch so haben;). ok und jetzt nur aus neugier; wie siehts denn mit primitiven datentypen aus? gibt es da eine möglichkeit die referenz in einer anderen methode zu ändern?


Ja, für primitive Datentypen gibt es sogenannte Kapselungen, d.h. du packst den primitiven Datentyp sozusagen einfach in ein Objekt. Das geht in etwa so: "Integer x = new Integer(42)", x ist nun ein Objekt und wird per Reference übergeben (wogegen 42 (oder eine Variable vom Typ int) per Value übergeben worden wäre)
Benutzeravatar
fw
 
Beiträge: 1356
Registriert: 17.05.06 19:37
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: Mathe

Beitragvon Spobo » 18.11.07 20:37

ah ok, heißt dass, es gibt zu jedem primitiven Datentyp auch noch mal einen "objektorientierten"?
Benutzeravatar
Spobo
 
Beiträge: 40
Registriert: 20.10.07 13:47

Beitragvon Coolcat » 18.11.07 20:45

es gibt zu jedem primitiven Datentyp auch noch mal einen "objektorientierten"?

Jap...die Dinger heißen "Hüllklassen".
  • Integer
  • Float
  • Double
  • Boolean
  • Byte
  • Long
  • Character


Man sollte sie nur dann verwenden, wenn man sie wirklich braucht. Hilfreich kann das z.B. sein, wenn man die diversen Datenstrukturen der Java-API benutzt.

Edit:
Teilweise sind auch die Operatoren überladen, d.h. es funktionieren Dinge wie:
Code: Alles auswählen
Integer i = 42;
i = i + 1;
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon mirko » 18.11.07 21:01

theTux hat geschrieben:
mirko hat geschrieben:es gibt variablen, die innerhalb einer gesamten klasse oder theoretisch sogar von außerhalb zu sehen sind. dieses sind dann aber klassen-attribute und sollten nur verwendet werden, wenn du _wirklich_ objektorientiert programmierst.

Attribute der Klasse: ja.
Attribute, die außerhalb der Klasse sichtbar sind: nein.


jap hast recht - hab mich nicht präzise genug ausgedrückt...
mirko
 
Beiträge: 1032
Registriert: 22.10.06 18:33
Studiert seit: WS 12/13

Beitragvon Tempest » 18.11.07 22:02

fw hat geschrieben:"Integer x = new Integer(42)", x ist nun ein Objekt und wird per Reference übergeben

Allerding sind alle Wrapper-Klassen für primitive Typen immutable.

Temp
Benutzeravatar
Tempest
 
Beiträge: 76
Registriert: 13.05.07 22:17
Studiengang: Informatik (M.Sc.)
Studiert seit: SS 07
Anwendungsfach: BWL

Beitragvon kb » 18.11.07 22:33

bedenke jedoch, dass du (falls du mit den Hüllklassen weiterarbeitest) z.B. nicht mehr die gleichen Vergleichsoperatoren (also ==, <= und so) verwenden kannst!
"Auch wenn fünfzig Millionen Menschen etwas Dummes sagen, bleibt es trotzdem eine Dummheit."
"It doesn't matter if you win or lose, it's whether or not you beat the spread."
Benutzeravatar
kb
 
Beiträge: 1237
Registriert: 06.04.06 21:20
Wohnort: Aachen / Köln

Beitragvon Coolcat » 18.11.07 22:40

Deswegen ist das "teilweise" oben rot...
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Nächste

Zurück zu Off-Topic