myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

[JAVA] Klausurfrage zu Arrays

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 13.07.11, 11:22   #1
Mephist0
Teufelskerl
 
Benutzerbild von Mephist0
 
Registriert seit: Jan 2010
Beiträge: 179
Bedankt: 1.643
Mephist0 ist noch neu hier! | 0 Respekt Punkte
Standard [JAVA] Klausurfrage zu Arrays

Hi zusammen.
Ich schreibe demnächst meine Klausur in Java. Bestandteil meines Lernens ist auch das durchgehen alter Klausuren des Dozenten.
Dabei kam mi eine Frage unter, von der ich zwar die Richtige Lösung weiß, sie aber nicht nachvollziehen kann.
Ich hoffe ihr könnt mir damit weiterhelfen:

Zitat:
What happens, when the following program is compiled and run. Select the one correct answer.

Code:
public class example {
	int i[] = {0};
	public static void main(String args[]) {
		int i[] = {1};
		change_i ( i );
		System.out.println( i[0] );
	}
	public static void change_i ( int i[] ) {
		int j[] = {2};
		i = j;
	}
}
A. The program is not compiled.
B. The program prints 0
C. The program prints 1
D. The program prints 2
E. The program prints 4
Meiner Meinung nach müsste 2 ausgegeben werden, da in der methode change_i dem Array i die Speicheradresse von j übergeben wird.

Korrekt ist allerdings Antwort C

Ich hoffe mir kann hier jemand weiterhelfen.
Mephist0 ist offline   Mit Zitat antworten
Ungelesen 13.07.11, 11:27   #2
mrburns
Newbie
 
Registriert seit: Dec 2009
Beiträge: 50
Bedankt: 28
mrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punkte
Standard

Ich kenn mich zwar in Java überhaupt nicht aus, aber ich denke mal das Stichwort heißt hier Call by Value,
mit der Funktion change_i wird nicht die Speicheradresse von i übergeben,
das hat zur Folge, dass der Werteumtausch in der Funktion nur temporär (nur innerhalb der Funktion) ist.
mrburns ist offline   Mit Zitat antworten
Ungelesen 13.07.11, 11:48   #3
Mephist0
Teufelskerl
 
Benutzerbild von Mephist0
 
Registriert seit: Jan 2010
Beiträge: 179
Bedankt: 1.643
Mephist0 ist noch neu hier! | 0 Respekt Punkte
Standard

Klingt auf jeden Fall nach einer plausiblen Lösung.

Kann man das generalisieren, wann etwas "by value" und wann "by reference" übergeben wird?
Mephist0 ist offline   Mit Zitat antworten
Ungelesen 13.07.11, 12:05   #4
Madhatter3333
Macianer
 
Registriert seit: Apr 2010
Beiträge: 139
Bedankt: 49
Madhatter3333 ist noch neu hier! | 0 Respekt Punkte
Standard

Java hat kein Call by Reference! ;-) Alles wird Call by Value übergeben.

Siehe: [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]

Grüße MH
Madhatter3333 ist offline   Mit Zitat antworten
Ungelesen 13.07.11, 15:34   #5
Mephist0
Teufelskerl
 
Benutzerbild von Mephist0
 
Registriert seit: Jan 2010
Beiträge: 179
Bedankt: 1.643
Mephist0 ist noch neu hier! | 0 Respekt Punkte
Standard

Danke für die Antwort. Damit ist meine Frage hinreichend geklärt.
Mephist0 ist offline   Mit Zitat antworten
Ungelesen 13.07.11, 15:38   #6
kalliknuddel
Anfänger
 
Registriert seit: Feb 2009
Ort: Berlin
Beiträge: 35
Bedankt: 18
kalliknuddel ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von mrburns Beitrag anzeigen
mit der Funktion change_i wird nicht die Speicheradresse von i übergeben,
das hat zur Folge, dass der Werteumtausch in der Funktion nur temporär (nur innerhalb der Funktion) ist.
Call by Value ist schon richtig^^
Allerdings wird die Speicheraddresse übergeben, sonst könnt er ja nich auf i zugreifen Oo
Und das ganze Array wird nich kopiert

Was passiert ist folgendes:
Beim Aufruf der Funktion wird change_i wird die Addresse von i1 (ich nenns jetz mal i1 und i2^^) kopiert.
Deshalb wären auch alle (!)Änderungen an i1(!) in der Funktion permanent.
Der Witz ist, dass die Kopie der Speicheraddresse ja geändert werden kann (was beim i = j passiert).
Allerdings ändert das ja wie gesagt nur die Kopie der Addresse und hat garkeine Auswirkung auf das Array an sich.

Bei einfachen Zuweisungen von Arrays werden diese nicht Kopiert sondern einfach nur die Referenzen auf die neue Umgebogen. Und "umgebogen" wird halt nur die Kopie.. deshalb ist die Ausgabe 1 =)
kalliknuddel ist offline   Mit Zitat antworten
Ungelesen 13.07.11, 15:50   #7
mrburns
Newbie
 
Registriert seit: Dec 2009
Beiträge: 50
Bedankt: 28
mrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punkte
Standard

Zitat:
Zitat von kalliknuddel Beitrag anzeigen
Call by Value ist schon richtig^^
Allerdings wird die Speicheraddresse übergeben, sonst könnt er ja nich auf i zugreifen Oo
Da widersprichst du dir selbst
Call by Value heißt nicht umsonst so, es wird nicht die Referenz auf die Speicheradressen, sondern nur der Inhalt an die Funktion übergeben,
der dann in eine neue Speicheradresse 'gepackt' wird, nur leider wird am Ende der Funktion kein Wert und keine Speicheradresse zurückgegeben,
damit verschwindet der neue Wert im RAM-Nirvana
mrburns ist offline   Mit Zitat antworten
Ungelesen 13.07.11, 15:51   #8
sirleo
is poking \\Device\\Beep
 
Registriert seit: May 2011
Beiträge: 201
Bedankt: 84
sirleo ist noch neu hier! | 0 Respekt Punkte
Standard

nein hier mal ein beispiel
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]

das objecte trotz call-by-value als referenz übergeben werden(im grunde genommen) hat
performance gründe.
__________________
Meine Rechtschreibfehler dürft ihr gerne behalten.
------------------------------------------------------------
Füttere keine Trolle!->Also unterstütz auch nicht Appel.
sirleo ist offline   Mit Zitat antworten
Ungelesen 13.07.11, 16:05   #9
mrburns
Newbie
 
Registriert seit: Dec 2009
Beiträge: 50
Bedankt: 28
mrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punkte
Standard

Zitat:
Zitat von sirleo Beitrag anzeigen
das objecte trotz call-by-value als referenz übergeben werden(im grunde genommen) hat
performance gründe.
Aber wirklich nur bei dem Typ Object, da das anscheinend einen Zeiger in Java darstellt, hier ging es um Integer, ich hab zu dem Thema noch was gefunden :

Zitat:
Zitat von Handbuch der Java-Programmierung, Kapitel 7.3.3
Alle Parameter werden in Java per call by value übergeben. Beim Aufruf einer Methode wird also der aktuelle Wert in die Parametervariable kopiert und an die Methode übergeben. Veränderungen der Parametervariablen innerhalb der Methode bleiben lokal und wirken sich nicht auf den Aufrufer aus.
...
Wie bereits erwähnt, sind Objektvariablen Referenzen, also Zeiger. Zwar werden auch sie bei der Übergabe an eine Methode per Wert übergeben. Da innerhalb der Methode aber der Zeiger auf das Originalobjekt zur Verfügung steht (wenn auch in kopierter Form), wirken sich Veränderungen an dem Objekt natürlich direkt auf das Originalobjekt aus und sind somit für den Aufrufer der Methode sichtbar. Wie in allen anderen Programmiersprachen entspricht die call by value-Übergabe eines Zeigers damit natürlich genau der Semantik von call by reference.
mrburns ist offline   Mit Zitat antworten
Ungelesen 13.07.11, 16:34   #10
Madhatter3333
Macianer
 
Registriert seit: Apr 2010
Beiträge: 139
Bedankt: 49
Madhatter3333 ist noch neu hier! | 0 Respekt Punkte
Standard

Alle Objekte sind vom Typ Object abgeleitet, also auch Integer....
Schliesslich is Object das Grundgerüst für alle anderen Klassen, diese sind einfach nur von Object abgeleitet.

Siehe dazu auch: [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ] unter dem Begriff "Integer"

Bitte nicht int mit Integer verwechseln! Das eine ist ne Klasse !

Grüße MH
Madhatter3333 ist offline   Mit Zitat antworten
Ungelesen 13.07.11, 17:07   #11
Mephist0
Teufelskerl
 
Benutzerbild von Mephist0
 
Registriert seit: Jan 2010
Beiträge: 179
Bedankt: 1.643
Mephist0 ist noch neu hier! | 0 Respekt Punkte
Standard

mit anderen worten: Bei int (wie in dem Beipsiel) bekomm ich am ende ne 1 ausgegeben.

Würde ich statt int ein:

Integer i = new Integer()

machen, würde ich meine 2 bekommen?
Mephist0 ist offline   Mit Zitat antworten
Ungelesen 13.07.11, 17:11   #12
sirleo
is poking \\Device\\Beep
 
Registriert seit: May 2011
Beiträge: 201
Bedankt: 84
sirleo ist noch neu hier! | 0 Respekt Punkte
Standard

jain, es kommt darauf an was für einen parameter die funktion erwartet.
Objekte vom Typ INTEGER casten sich,meines wissens nach selbst in einen Wert. wenn nötig.
Deswegen hat Madhatter3333 auch nur teilweise recht. und wenn ein Object übergeben wird, dann wird eine Referenz übergeben, also ja genau das was du gerade meintest.

btw:
@mrburns,
selbst wenn du diese einschränkung machst, da alle objekte vom Typ Object abgeleitet sind bedeutet dies auch jedes Objekt ist vomtyp Knicknack und vom Typ Object und somit gilt für deine Objekte auch Referenzübergabe.
OOP ist sowas tolles


//edit
anders macht das auch keinen sinn.
Ich kann zwar bestimmte eigenschaften vom Vaterobjekt dem Kindobject vorenthalten, aber wenn ich für alle meine Objekte, jedesmal
ein RICHTIGES call by value ohne Referenzübergabe machen müsste, dann würden solche sachen wie JEE und größere Javaprojekte einfach bergab gehen da sie nicht performant genug sind.
__________________
Meine Rechtschreibfehler dürft ihr gerne behalten.
------------------------------------------------------------
Füttere keine Trolle!->Also unterstütz auch nicht Appel.
sirleo ist offline   Mit Zitat antworten
Ungelesen 14.07.11, 11:01   #13
mrburns
Newbie
 
Registriert seit: Dec 2009
Beiträge: 50
Bedankt: 28
mrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punkte
Standard

@ sirleo
Wie gesagt ich hab von Java überhaupt keinen Plan, ich habs so nur in dem Textstück gelesen, das ich gepostet hab.

Ich kenn das nur von C# so, dass alle einfachen Datentypen von einer ValueType Klasse abgeleitet sind und deshalb
nicht direkt wie Zeiger behandelt werden, oder in C++ werden nur Variablen als Zeiger verwendet, die ausdrücklich als solche definiert sind,
das beides scheint wohl bei Java nicht der Fall zu sein.
mrburns ist offline   Mit Zitat antworten
Ungelesen 14.07.11, 11:22   #14
sirleo
is poking \\Device\\Beep
 
Registriert seit: May 2011
Beiträge: 201
Bedankt: 84
sirleo ist noch neu hier! | 0 Respekt Punkte
Standard

ich bin auch nicht so der Javacrack(hatte damit nur ein paar Jahre zu tun).
Java hat wenn du so willst 2 Ansätze.
Alles ist ein objekt aber es gibt auch primitive Datentypen, was zB dem valueType-Klasse in C# entspricht.
Aber du hast auch, Objekte der Primitiven Datentypen(haste in C# auch, ich sach nur new Int());

btw, die teile musste in C# auch als Pointer handhaben können, sonst wäre Marshalling bei Unmannaged Code mit DllImport so eine schwierige Sache, obwohl man da dann einen Wrapper vom Typ System.IntPtr benutzt um den Pointer zu übergeben, aber möglich ist es wenn auch kein Pointer vom Typ *int [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ] .

btw: meine argumentationskette ist Grundlage von so ziemlich jeder OOP-Sprache die ich kenne, hat also nicht unbedingt was mit der Sprache zu tun,sondern ist vielmehr eine Frage der Eigenschaften von OOP und cleverem Design.

Und um nochmal auf das Thema zurrückzukommen hier ein kleines Beispiel :



//edit

BTW, ganz vergessen,
Metphist0,wegen deiner ursprünglichen Fragestellung:
Alles was hier über call-by-reference und call-by-value und objecte etc gesagt wurde ist wahr, aber halt nur bis zu einem gewissen Grad.
Integer ist immutable genauso wie andere Objekte die Datentypen enthalten.
Und sie haben auch noch die Eigenschaft das sie, als einzige objekte mittels call-by-value übergeben werden.
Alle anderen Objekte,vor allem deine eigenen Objekte, sind Call-by-reference.
D.h. wird bei deinem Codebeispiel aus der Klausur auch 1 ausgegeben.
(sowas hat man mir in bezug auf Java nie beigebracht nur dieses call-by-Reference gilt FÜR ALLE OBJEKTE *grübel* naja, selbst lesen macht klug ) und somit ist mein letzter Post vor diesem hier, nicht wirklich richtig.... hey was gelernt
__________________
Meine Rechtschreibfehler dürft ihr gerne behalten.
------------------------------------------------------------
Füttere keine Trolle!->Also unterstütz auch nicht Appel.
sirleo ist offline   Mit Zitat antworten
Ungelesen 14.07.11, 12:54   #15
mrburns
Newbie
 
Registriert seit: Dec 2009
Beiträge: 50
Bedankt: 28
mrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punkte
Standard

Zitat:
Zitat von sirleo Beitrag anzeigen
ich bin auch nicht so der Javacrack(hatte damit nur ein paar Jahre zu tun).
Ein paar Jahre ist gut....
Ich versuche mich jetzt seit ca. 2 Wochen in C# und in der Schule behandeln wir nun seit ca 1 1/2 Jahren C++, hatten aber merkwürdiger Weise nichts über OOP, das hab ich mir vor ca. einer Woche versucht anzueignen

Aber ich glaube mit Vererbung gehen wir schon viel zu weit, ursprünglich wollte er ja nur wissen warum nicht die 2 ausgegeben wird

@Thema
Zitat:
Code:
Integer i = new Integer();
[...]
jain
Würde es denn mit
Code:
object i=new integer();
klappen?

// Ok, dann hatte ich in dem Artikel was Grundlegendes falsch verstanden, ich les den lieber nochmal...
mrburns ist offline   Mit Zitat antworten
Ungelesen 14.07.11, 13:03   #16
sirleo
is poking \\Device\\Beep
 
Registriert seit: May 2011
Beiträge: 201
Bedankt: 84
sirleo ist noch neu hier! | 0 Respekt Punkte
Standard

Lies dir dazu mal Polymorphie durch.
D.h. die Variable vom Typ Object kann jedes Objekt in Java aufnehmen, aber Dank polymorphie hat jedes Objekt das du in die variable vom Typ Object packtst immer noch die gleichen eigenschaften.
__________________
Meine Rechtschreibfehler dürft ihr gerne behalten.
------------------------------------------------------------
Füttere keine Trolle!->Also unterstütz auch nicht Appel.
sirleo ist offline   Mit Zitat antworten
Ungelesen 14.07.11, 14:44   #17
rabite
Anfänger
 
Registriert seit: Jan 2011
Beiträge: 16
Bedankt: 3
rabite ist noch neu hier! | 0 Respekt Punkte
Standard

Das ist zwar alles interessant(und vieles richtig), aber der Grund, dass die Methode nicht funktioniert ist, dass nicht auf dem uebergebenen Objekt gearbeitet wird (ein Array ist auch mit einem primitiven Datentyp ein Objekt) sondern ein neues erzeugt wird und nur in der Methode die Vatiablen geaendert werden:
public static void change_i(int[]i){
i[0]=2;
return;
}
sorgt fuer eine 2

Das mit dem Integer (als Objekt) ist zwar richtig, allerdings ist die set-Methode gesperrt - es laesst sich also nicht so benutzen.
rabite ist offline   Mit Zitat antworten
Ungelesen 21.07.11, 01:58   #18
Kwaggax
Anfänger
 
Registriert seit: Apr 2011
Beiträge: 3
Bedankt: 3
Kwaggax ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von rabite Beitrag anzeigen
Das ist zwar alles interessant(und vieles richtig), aber der Grund, dass die Methode nicht funktioniert ist, dass nicht auf dem uebergebenen Objekt gearbeitet wird (ein Array ist auch mit einem primitiven Datentyp ein Objekt) sondern ein neues erzeugt wird und nur in der Methode die Vatiablen geaendert werden:
public static void change_i(int[]i){
i[0]=2;
return;
}
sorgt fuer eine 2

Das mit dem Integer (als Objekt) ist zwar richtig, allerdings ist die set-Methode gesperrt - es laesst sich also nicht so benutzen.
Das sorgt auch nicht für eine 2. :-D
Der wirft nur einen Fehler aus. So wie ich das sehe. :-D
Kwaggax ist offline   Mit Zitat antworten
Ungelesen 21.07.11, 15:41   #19
rabite
Anfänger
 
Registriert seit: Jan 2011
Beiträge: 16
Bedankt: 3
rabite ist noch neu hier! | 0 Respekt Punkte
Standard

Ich weiss nicht was Du meinst - Ich habs gerade noch einmal hieraus zusammenkopiert und es funktioniert genau wie gesagt - oder ich versteh den Witz nicht so ganz
rabite ist offline   Mit Zitat antworten
Ungelesen 27.10.11, 15:58   #20
isimsiz_57
Anfänger
 
Registriert seit: Dec 2009
Beiträge: 1
Bedankt: 0
isimsiz_57 ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
public static void change_i ( int i[] ) {
int j[] = {2};
i = j;
}
das "void" vor der methode "change_i" bedeutet das nichts zurückgeben wird

Zitat:
return i;
nur eine Erweiterung um den Returnwert erzeugt deshalb ein C-Fehler!

Wenn du eine "2" ausgeben möchtest musst du zusätzlich das void in das notwendige Format bringen:

Zitat:
public int[] void change_i ( int i[] ) {
int j[] = {2};
i = j;
return i;

}
isimsiz_57 ist offline   Mit Zitat antworten
Ungelesen 27.10.11, 17:36   #21
urga
Mitglied
 
Benutzerbild von urga
 
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
urga ist noch neu hier! | 0 Respekt Punkte
Standard

lol. setzen 6.

aber nichtsdestotrotz willkommen im forum
__________________
entropie erfordert keine wartung
urga ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 Uhr.


Sitemap

().