# Grundfragen zu Java



## lol-mimi (8. Mai 2012)

Ich habe einige Fragen, welche ich für mich selber beantwortet habe allerdings weis ich nicht ob ich das auch richtig beantwortet hab.

was ein JVM ist? Eine virtuelle Maschiene sozusagen eine Umgebung die plattform unabhängig ist. Die mir ermöglicht auf verschiedenen Plattformen zu arbeiten bzw. java code auf dem pc anzuzeigen, oder?

wie funktioniert ein heap? hat jemand eine einfache Erklärung? ich habe viele seiten gefunden wo es über heap-sort erklärt wird, allerdings weis ich nicht ob es das selbe ist.

was macht ein Garbage Collector? er löscht aus automatisch nicht refrenzierten Datein.

wie kann ich einen Aufruf starten? (Konstruktor/Main Methode/ und allg.)

wann setze ich eine schleife ein? oder warum? und warum while, wofür ist sie da? oder do-schleife? for ist für mich am logischten, die anderen verstehe ich nicht warum sie da sind.

ich bin euch dankbar für jede antwort.

grüße
mimi


----------



## HimBromBeere (8. Mai 2012)

Zu 1: Die JVM ist nicht plattformunabhängig. Die JVM ist eine Schnittstelle, die du für jedes Betriebssystem installieren musst. Sie kümmert sich darum, dass dein Bytecode auf deinem System läuft.(Java Virtual Machine ? Wikipedia)

Zum Thema Heap bist du hier nicht schlau draus geworden?

Garbage Collecor ist, wie du bereits gesagt hast, ein Müllsammler, der nicht mehr referenzierte Inhalte aus dem Speicher schmeißt bzw. sie zum Löschen vorsieht. Dürfte dir in JAVA aber sowieso eher selten unterkommen. 

Zu den Schleifen: do- und while-Schleifen machen haargenau das selbe, in vielen Sprachen (wie auch JAVA) funktionieren sie zum Teil auch nur zusammen 
	
	
	
	





```
(do{...}while
```
). Beide tun etwas, solange die Bedingung war ist bzw. bis diese erreicht wird. Im Gegensatz zur for-Schleife, in der eine genaue Anzahl Schritte gemacht wird, kannst du mit diesen beiden eine variable Anzahl Schritte machen, um zu einem Endergebnis zu kommen (ich weiß, dass auch die for-Schleife nicht so festgelegt ist, aber die "klassische" macht eben x Schritte).


----------



## lol-mimi (8. Mai 2012)

vielen dank für deine Antwort


----------



## 127.0.0.1 (8. Mai 2012)

> wie kann ich einen Aufruf starten? (Konstruktor/Main Methode/ und allg.)



--> indem du den Methodenname schreibst, dann () dahinter und ein Semikolon

```
DeineMethode();

//wenn die methode einen Übergabewert hat logischerweise den Wert mit angeben
String Bla = "Hallo";
DeineMethodeMitWert(Bla);
```



> wann setze ich eine schleife ein? oder warum?



--> Schleifen setzt du ein wenn du eine bestimmte Abfolge mehrmals durchlaufen möchtest, oder solange bis ein Ereignis eintrifft (z.B. bis das Array leer ist, oder bis eine Zahl erreicht ist)

Mit einer 

```
while(DeinEreignis)
{
System.out.println("Hallo");
}
```
Schleife kannste du ein Ereignis abfragen

Mit einer

```
for(i=0;i<10;i++)
{
System.out.println("Hallo");
}
```
kannst du solange durchlaufen wie der "i" Wert kleiner 10 ist......oder ebend irgend ein anderer Wert 

Gruß


----------



## lol-mimi (8. Mai 2012)

besten Dank


----------



## diggaa1984 (8. Mai 2012)

127.0.0.1 hat gesagt.:


> ```
> while(DeinEreignis) {
> System.out.println("Hallo");
> }
> ```




```
while(DeinEreignis) {
System.out.println("Hallo");
//Anweisungen die das Ereignis irgendwann "beenden"
}
```

Nur der Korrektheit halber, sonst wird die Schleife entweder nie durchlaufen oder unendlich oft (ausser man möchte das ^^)


----------



## askk (8. Mai 2012)

127.0.0.1 hat gesagt.:


> --> indem du den Methodenname schreibst, dann () dahinter und ein Semikolon
> 
> ```
> DeineMethode();
> ...



Wenn du Tipps gibst, wäre es vielleicht ganz gut sich an die Code Conventions zu halten. 
Code Conventions for the Java Programming Language


----------



## 127.0.0.1 (8. Mai 2012)

> Wenn du Tipps gibst, wäre es vielleicht ganz gut sich an die Code Conventions zu halten.



Oh man Leute ^^
ich denke mal dass lol-mimi Anfänger ist und einfach nur ein par Grund Infos bekommen wollte


----------



## askk (8. Mai 2012)

Sollte man nicht besonders bei Anfängern darauf achten?


----------



## 127.0.0.1 (8. Mai 2012)

wollte er korrekten Code oder nur Infos ?


----------



## dev.buzz (8. Mai 2012)

askk hat gesagt.:


> Sollte man nicht besonders bei Anfängern darauf achten?



OT:

MUSS man überhaupt drauf achten?


----------



## faetzminator (8. Mai 2012)

SK.Buzz hat gesagt.:


> MUSS man überhaupt drauf achten?



Sofern man es irgendwann beruflich in einem Team machen will: *Ja!*


----------



## Firephoenix (8. Mai 2012)

faetzminator hat gesagt.:


> Sofern man es irgendwann beruflich in einem Team machen will: *Ja!*



Anderes Beispiel:

Man musz zich Auc nist ann di deutshe RestsChreibug halten, aber man macht es damit Leuten leichter die es gewohnt sind Texte zu lesen den eigenen Kram zu verstehen den man vermitteln will


----------



## 127.0.0.1 (8. Mai 2012)

na also, dann passts doch ^^
Wollte ja nur ein einfaches Code Beispiel posten ohne mich groß an Conventions zu halten 

Aber eigentlich müssen wir lol-mimi fragen, obs reicht oder ob noch mehr verlangt wird ^^


----------



## maki (8. Mai 2012)

Firephoenix hat gesagt.:


> Anderes Beispiel:
> 
> Man musz zich Auc nist ann di deutshe RestsChreibug halten, aber man macht es damit Leuten leichter die es gewohnt sind Texte zu lesen den eigenen Kram zu verstehen den man vermitteln will


Dein Beispiel hinkt, denn allein mit dieser Rechtschreibung würdest du als Schriftsteller verhungern


----------



## Firephoenix (8. Mai 2012)

[OT]Jetzt hast du mir das Weltbild von meinem Traumberuf zerstört ;([/OT]

Ich meinte damit eigentlich nur, dass es einfach angenehmer für andere Leute ist wenn man sich an gängige Konventionen hält, unabhängig davon ob man in den Beruf geht oder nicht.

Gruß


----------



## HimBromBeere (8. Mai 2012)

Auch wenn ich mir der Ironie bewusst bin, einmal mehr nichts zum eigentlichen Thema beizusteuern und damit den Anteil an OT in diesem Thema noch weiter zu steigern, möchte ich doch alle Beteiligten an das Eigentliche erinnern: es ging um eine handvoll Java-Grundlagen-Fragen, die weder was mit Rechtschreibung noch mit der Sinnhaftigkeit von Konventionen zu tun hatte...


----------



## 127.0.0.1 (8. Mai 2012)

> die weder was mit Rechtschreibung noch mit der Sinnhaftigkeit von Konventionen zu tun hatte



genau !
Und ich denke für einen Anfänger der ein paar Grundkenntnisse vermittelt bekommen möchte reicht der Code allemal....
da muss man keine Richtlinien zur programmierung einhalten 

Zudem sich lol-mimi nicht mehr gemeldet hat, scheint's zu reichen ^^


----------



## ARadauer (8. Mai 2012)

Doch methoden schreibt man klein und basta


----------



## Gast2 (8. Mai 2012)

Da kann sich Mr. Loopback ja noch so sehr rausreden. Code Conventions sind zwar nicht Gesetz, aber wer sich bei mir nicht dran hält bekommt auf die Röffel!


----------



## Tomate_Salat (8. Mai 2012)

127.0.0.1 hat gesagt.:


> genau !
> Und ich denke für einen Anfänger der ein paar Grundkenntnisse vermittelt bekommen möchte reicht der Code allemal....
> da muss man keine Richtlinien zur programmierung einhalten



:autsch: Konventionen sind nicht ohne Grund vorhanden und dass man darüber Diskutieren muss, ist auch schon traurig. 



> Wollte ja nur ein einfaches Code Beispiel posten ohne mich groß an Conventions zu halten


Was ist denn das für eine Aussage? Wenn man sich an die Konventionen hält, dann tippt man die ohne drüber nachzudenken runter. Im Umkehrschluss heißt das für mich, dass du dich da nicht sonderlich dran zu halten scheinst. 

Eine Umgewöhnung ist immer eine hässliche Sache, lieber von Anfang an richtig machen, dann spart man sich den Schritt (und meine Kommentare bzgl. Konventionen [siehe Signatur]).


----------



## lol-mimi (9. Mai 2012)

danke Leute sehr lieb von euch. falls noch Fragen aufkommen werde ich mich melden, soweit sind die Antworten sehr hilfreich. Bis zum 3.07.12 habe ich noch Zeit mir das Buch "Grundkurs programmieren in java" durchzupauken und ich denke bis dahin werden noch einige Fragen aufkommen.


----------



## 127.0.0.1 (9. Mai 2012)

na dann, viel Spaß beim lesen ^^

Und wenn du noch weitere Bücher brauchst kannste mal hier stöbern 

Gruß


----------



## lol-mimi (22. Jun 2012)

class ByteCast {
  public static void main(String[] args) {
    // byte b = 1234;   Diese Zeile würde einen Compiler-Fehler verursachen
    byte b = (byte)1234;
    /*
     * Diese Zeile ist syntaktisch korrekt,
     * b hat aber den Wert -46
     */
     System.out.println("b = " + b);
  }
}

wie kommt man auf -46? brauche den rechenweg

vielen Dank


----------



## Tomate_Salat (22. Jun 2012)

> wie kommt man auf -46? brauche den rechenweg



It's black magic.

Schau dir mal Datentypen an. Ein byte kann nur Zahlen bis zu einer gewissen Größe aufnehmen. Danach "fängt es wieder von vorne an". 

Pseudobeispiel:
MeinDatentyp kann zahlen von -10 bis +10 aufnehmen. 
Wenn ich jetzt 11 dort reinspeichern möchte, erhalte ich: -10

Letzter Tipp:
Modulo-rechnung sollte dir hier helfen.


----------



## lol-mimi (28. Jun 2012)

Danke für die Antwort.

in dem fall durchläuft er erst von 0 bis +10 dann springt er auf -10. 1-2-3-4-5-6-7-8-9-10-(-10)-(-9)-(-8)-(-7)-(-6)-(-5)-(-4)-(-3)-(-2)-(-1)-0 und dann wieder von vorn.
oder?
weil jetzt ergibt sich -10


----------



## lol-mimi (28. Jun 2012)

ich verstehe nicht, warum man setter und getter braucht. Auch wennman sagt das man dies braucht weil man den Code überprüfen will z.b. durch if-bed. wirds mit trotzdem nicht klar, denn ich könnte genau so die Instanz-Variable auf public setzen und diese ebenfalls überprüfen, für was dann die setter udn getter?

Noch was, die neue deklaration (falls es so heißt) von
Leistung ins neueLeistung (ich hab doch schon Leistung ) für was dann in neueLeistung. 
private int leistung;
private int lehersteller;

public void tunen (int tuneWert) {
	leistung = leistung + tuneWert ;

public int getLeistung(){
return leistung;

public void setLesistung (int neueLeistung){
*leistung = neueLeistung*;




genau so die inst. variablen von auto = new auto (der wert von auto wird doch verändert, warum muss new auto bzw. eine referenz darauf,gemachen werden, warum)

public static void main (String [] args){

*Auto bmw = new Auto* (100, „BMW“);



vielen dank


----------



## nillehammer (28. Jun 2012)

lol-mimi hat gesagt.:
			
		

> wie kommt man auf -46? brauche den rechenweg





			
				Tomate_Salat hat gesagt.:
			
		

> Schau dir mal Datentypen an. Ein byte kann nur Zahlen bis zu einer gewissen Größe aufnehmen. Danach "fängt es wieder von vorne an".


Vielleicht meinte Tomate_Salat das Richtige, aber die Erklärung gefällt mir nicht so ganz.

Für das Verständnis des Verhaltens ist es zunächst wichtig, sich den Speicher anzuschauen, den die unterschiedlichen Datentypen beanspruchen:

long: 64bit = 8 byte
int: 32bit = 4 byte
short: 16bit = 2byte
byte: 8bit = 1 byte
Bei einem Cast von einem der größeren Datentypen auf byte nimmt die JVM einfach die letzten 8 bit des gegebenen Wertes und schreibt diese in das byte.

Wie kommen da jetzt bei gegebenen positiven (int-)Werten negative byte-Werte (bspw. -46) zustande? Das hängt damit zusammen, wie die JVM negative Werte abspeichert. Sie bedient sich dafür des sog. 2er-Komplements (Zweierkomplement ? Wikipedia). Das ist vielleicht nicht ganz leicht zu verstehen, aber eines kann man sich leicht merken: "Wenn das erste bit (egal bei welchem Ganzzahltyp) eine 1 enthält, ist es eine negative Zahl." Wenn Du also einen positiven int-Wert erzeugst, bei dem das 25. bit zufällig eine _1_ ist, landet dieses im ersten bit des byte und damit wird das byte eine negative Zahl. Welche genau? Dafür schau Dir die 8 bit des byte an und wende das Verfahren hier an: Zweierkomplement ? Wikipedia


----------



## nillehammer (28. Jun 2012)

> ich verstehe nicht, warum man setter und getter braucht. Auch wennman sagt das man dies braucht weil man den Code überprüfen will z.b. durch if-bed. wirds mit trotzdem nicht klar, denn ich könnte genau so die Instanz-Variable auf public setzen und diese ebenfalls überprüfen, für was dann die setter udn getter?


Dazu ein Beispiel, gegeben sei die Klasse Mensch mit der Instanzvariblen alter. Alter darf logischerweise nicht negativ sein. Zunächst die Variante mit setter

```
public class Mensch {
  private int alter;

  public void setAlter(int alter) {
    if (alter <0) {
      throw new IllegalArgumentException("Alter darf nicht kleiner 0 sein!");
    }
    this.alter = alter;
  }

  public int getAlter() {
    return this.alter;
  }
}
```
Die Prüfung steht hier genau da, wo sie fachlich hingehört. Und sie muss* nur einmal *codiert werden. Außerdem kannst Du damit sicher sein, dass egal, wo Du eine Instanz von Mensch benutzt, der getter *immer* ein gültiges Alter zurückliefert. Mit dieser Methode ist es also selbst für unvorsichtige oder ignorante Programmierer unmöglich, Deine Klasse falsch zu benutzen.


----------



## Tomate_Salat (28. Jun 2012)

nillehammer hat gesagt.:


> Mit dieser Methode ist es also selbst für unvorsichtige oder ignorante Programmierer unmöglich, Deine Klasse falsch zu benutzen.



es ist FAST unmöglich ;-)


----------



## lol-mimi (28. Jun 2012)

private int leistung;
private int hersteller;

public void tunen (int tuneWert) {
leistung = leistung + tuneWert ;

public int getLeistung(){
return leistung;

public void setLeistung (int neueLeistung){
leistung = neueLeistung;

Sorry bin zu dumm, verstehe nicht den Sinn der Setter und Getter Methode. Durch die beide verändert man nachhinein trozdem den Wert oder nicht? warum dann nicht sofort public bei int leistung oder erstellt er mir einn anderes Objekt, durch setter. 

ich stelle es mir so vor: leistung ist ein Karton alle werte die durch tunen rauskommen werden dort gespeichert. wenn aber privat die leistung ist dann ist dieser karton zu aber durch die getter und setter wird trotzdem auf den Wert aus dem karton zugegriffen und verändert.
wenn es sowieso durch getter und setter geschieht, warum nicht gleich den karton öffnen also public.
es kann sein das meine logik falsch ist, bitte korriegiert mich


----------



## dev.buzz (28. Jun 2012)

Lernst du überhaupt? Bin selbst ein Javaanfänger kann aber anhand allen deinen Beispielen mir im Kopf schon ausmalen was der Code bewirkt ..


----------



## nillehammer (28. Jun 2012)

> Sorry bin zu dumm, verstehe nicht den Sinn der Setter und Getter Methode.


Offensichtlich :lol:, tschuldigung, konnte ich mir nicht verkneifen... natürlich nicht!


> Durch die beide verändert man nachhinein trozdem den Wert oder nicht?


Nein, den Wert ändert nur der Setter. Der Getter liefert ihn nur zurück. Es geht auch garnicht nur darum, dass ein Wert geändert werden soll, sondern darum, diese Änderung auf gültige Werte zu beschränken. Bei public variablen kann jeder reinschreiben, was er will, bei settern gibt es die Möglichkeit, ungültige Werte abzuweisen.


> warum dann nicht sofort public bei int leistung


Schau Dir mal mein Beispiel von heute 11:48 an. Das kann man auch auf Dein Beispiel mit der Leistung anwenden. Wenn es die Anforderung gibt, dass Leistung immer positiv sein muss, wäre es doch toll, wenn Du nur an genau einer Stelle im Code die Prüfung (leistung >= 0) schreiben musst und nicht an 10 Stellen. Weiterhin wäre es doch toll, wenn Du sicher stellen könntest, dass es in der ganzen Welt nur Instanzen Deiner Auto-Klasse gibt, bei denen sich jeder Nutzer Deiner Klasse darauf verlassen kann, dass sie nur gültige Werte enthält. Das macht man mit privaten Variablen und mit Settern. Hoffe, das war jetzt verständlich, denn besser kann ich es nicht erklären.


> oder erstellt er mir einn anderes Objekt, durch setter.


Nein, der Setter ändert nur den Wert der entspr. Instanzvariable. Dabei wird keine neue Instanz erzeugt.

P.S. Wenn Du Code postest, dann rücke ihn doch wenigstens ein und beutze Java-Tags (die Tasse über dem Eingabefeld).


----------



## lol-mimi (28. Jun 2012)

dev.buzz hat gesagt.:


> Lernst du überhaupt? Bin selbst ein Javaanfänger kann aber anhand allen deinen Beispielen mir im Kopf schon ausmalen was der Code bewirkt ..



ich finde es gut das du es verstehst, dann brauchts du doch andere nicht unmotivieren. Bevor du dir die Zeit nimmst, dich hier selbst zu loben, dann hättest du diese inverstiert in die Erklärung, damit ich das auch verstehe. Aber wenn es dir nicht gefällt was ich reingestelle dann klicke doch weiter und beartworte die themen die die gefallen. Du musst nicht auf meine Frage reagieren, es steht jedem frei.


----------



## lol-mimi (28. Jun 2012)

nillehammer hat gesagt.:


> Schau Dir mal mein Beispiel von heute 11:48 an. Das kann man auch auf Dein Beispiel mit der Leistung anwenden. Wenn es die Anforderung gibt, dass Leistung immer positiv sein muss, wäre es doch toll, wenn Du nur an genau einer Stelle im Code die Prüfung (leistung >= 0) schreiben musst und nicht an 10 Stellen. Weiterhin wäre es doch toll, wenn Du sicher stellen könntest, dass es in der ganzen Welt nur Instanzen Deiner Auto-Klasse gibt, bei denen sich jeder Nutzer Deiner Klasse darauf verlassen kann, dass sie nur gültige Werte enthält. Das macht man mit privaten Variablen und mit Settern. Hoffe, das war jetzt verständlich, denn besser kann ich es nicht erklären.



Danke schön für die Erklärung


----------



## Firephoenix (28. Jun 2012)

Außerdem bieten dir getter und setter die Möglichkeit von deinen internen daten zu abstrahieren.

Beispiel: Deine Klasse Konto bietet die Möglichkeit ganze Beträge in cent (int) abzuheben und einzuzahlen.
Intern berechnest du die Zinsen aber natürlich auf mehrere nachkommastellen (double), ein Kunde wird aber nie 0.3 Cent abheben (wie auch, kann ja nicht ausgezahlt werden).


```
public class Konto {

	private double amount = 0;

	public Konto(int amount){
		setAmount(amount);
	}
	
	private void setAmount(int amount) {
		this.amount = amount;
	}

	public void doPayment(){
		amount = amount *0.75;
	}
	
	public int getAmount(){
		return (int) amount;
	}
	
	public void deposit(int amount){
		if(amount < 0){
			throw new IllegalArgumentException("Use withdraw() to deposit negative amounts");
		}
		this.amount += amount;
	}
	
	public void withdraw(int amount){
		if(amount < 0){
			throw new IllegalArgumentException("Use deposit() to withdraw negative amounts");
		}
		this.amount -= amount;
	}

}
```

Nach außen arbeitest du mit int, die Kontrolle darüber ob abgehoben werden darf oder nicht führt das Konto und du musst es nicht an 100 stellen im client-code schreiben (und dort vergessen), außerdem versteckst du deine internen daten, du kannst jederzeit den Datentyp in Float, BigDecimal oder irgendwas eigenes ändern ohne dass sich die Schnittstellen zum Client ändern - nichts in deinem restlichen Programm würde sich ändern. Legst du dagegen das Feld offen muss jeder Client sicherstellen, dass er das Feld korrekt benutzt und bei Änderungen müssen sich alle Clients mit Ändern - dies führt zu hoher Fehleranfälligkeit und extrem viel Wartungsaufwand im Programm.


[TIPP]übrigens: in dem beispiel nutze ich einen privaten setter im Konstruktor, dies macht hier jetzt auf den ersten Blick wenig Sinn, ist allerdings ein Stil den ich begründen kann: angenommen du setzt deine Felder im Konstruktor nach dem Schema this.x = x; und führst später einen setter ein in dem du z.b. x nur auf bestimmte werte zulassen willst. Entweder du schreibst jetzt den gleichen Code redundant im Konstruktor (Code-Duplication - böse), oder du ersetzt den Code im Konstruktor. vergisst du dies, kann man deine Klasse evtl mit illegalen Werten initialisieren die du nicht erwartest (stell dir ein Konto vor, dass nur positive beträge beim setter zulässt und jemand erzeugt es mit new Konto(-5000)...).
Da der Setter schon vorhanden und auch im Konstruktor verwendet wird, muss ich lediglich den accessor auf public setzen und meine vorhandene Methode erweitern. Auch wenn ich Bedingungen für das Feld setzen will ohne meinen Konstruktor aufzublasen passe ich einfach meinen privaten setter an[/TIPP]
Gruß


----------



## lol-mimi (28. Jun 2012)

Vielen Dank für Antwort.


----------



## lol-mimi (28. Jun 2012)

was macht komplexe Datentypen aus?


----------



## Firephoenix (28. Jun 2012)

Am Beispiel auf die Bank:
Vielleicht hat die Bank intern einen Datencontainer der komplett in Dollars rechnet und nutzt diesen für alle Implementierungen ihrer Bankkonten (deusche konten, amerikanische konten etc), in deinem Bankkonto willst du aber nur cents abheben, wie die bank das intern in dollar umrechnet und speichert interessiert dich als client nicht -> private felder, public zugriffsmethoden.

Gruß


----------



## lol-mimi (28. Jun 2012)

vielen vielen dank


----------



## dev.buzz (29. Jun 2012)

lol-mimi hat gesagt.:


> ich finde es gut das du es verstehst, dann brauchts du doch andere nicht unmotivieren. *Bevor du dir die Zeit nimmst, dich hier selbst zu loben, dann hättest du diese inverstiert in die Erklärung, damit ich das auch verstehe.* Aber wenn es dir nicht gefällt was ich reingestelle dann klicke doch weiter und beartworte die themen die die gefallen. Du musst nicht auf meine Frage reagieren, es steht jedem frei.



Kurz und Knapp: Nö!


----------



## Tomate_Salat (29. Jun 2012)

@lol-mimi: 
Wenn du Java lernen willst würde ich dir empfehlen, dir mal entsprechende Fachliteratur zuzulegen (z.B. Java von Kopf bis Fuß wird gerene empfohlen). 
Gut als Nachschlagewerk (zum lernen imho weniger geeignet): Galileo Computing :: Java ist auch eine Insel - index
Was imho auch sehr gut ist, ist der Java Video Kurs - Java Video Tutorials - Online Java lernen! von HDI.

Deine Fragen hätten dir die Lernhilfen (Videokurs/Literatur) auf jeden Fall beantwortet und ich befürchte, dass ganze entwickelt sich hier in Richtung "Unterricht".


----------

