Java Applet

Neue Frage »

Auf diesen Beitrag antworten »
tigerbine Java Applet

Ich möchte ein Java Applet im Firefox unter Linux testen. In Eclipse gibt der Applet viewer das Applet auch wieder. Im Firefox erhalte ich die Fehlermeldung "NullPointerException" oder "Applet nicht initialisiert."

Der Code ist aus einem Trainingsbuch, wobei ich (nachdem es nicht funktionierte) 2 Dinge verändert habe.

public vor class eingefügt, dann erst funktionerte der Appletviewer.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
import java.awt.Graphics;

public class HelloWorldApplet extends java.applet.Applet{

 public void paint(Graphics g) {
     g.drawString("Hello World", 5, 25);
 }
}


Hier applet-tag vor body geschlossen, im Buch wird dies erst nach body geschlossen verwirrt (habe ich gedreht) Und warum wird der Paragraph nicht geschlossen verwirrt

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
<html>
<head>
<title>Hello to everyone!</title>
<body>
<p>My java Applet says:<br>
<applet code="HelloWorldApplet.class" width=150 height=25>
</applet>
</body>
</html>


Wie ihr am Hello World seht, bin ich mit Java noch ganz am Anfang, wer kann mir weiterhelfen? Wink

Kann es an Firefoxeinstellungen liegen?
 
Auf diesen Beitrag antworten »
eulerscheZahl RE: Java Applet

Zitat:
Bis zur Verabschiedung des HTML 4.0-Standards, war das Applet-Tag zum Einbinden von Java-Applets in Webseiten vorgesehen. Inzwischen gilt es als veraltet und wurde vom W3C mit dem Object-Tag ersetzt. In HTML5 funktioniert es gar nicht mehr.

von wiki.byte-welt.net
Da steht auch, wie es richtig geht, nämlich mit object

Das Fehlen von </p> kommt mir auch komisch vor.


edit: etwas rumprobiert:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
<html>
  <head>
    <title>Hello to everyone!</title>
  <body>
    <p>My java Applet says:<br>
    object:<br>
    <object classid="java:HelloWorldApplet.class" 
      codetype="application/java-vm" width=200 height=200>
    </object>
    <br> <br>
    applet:<br>
    <applet code="HelloWorldApplet.class" width=200 height=200>
    </applet>
    </p>
  </body>
</html>

Das Problem war, dass das Fenster etwas zu schmal war, um mitzuteilen, dass hier eine Applet wäre, die aber gesperrt wurde.

Und ich jebe Karlito Recht, Java hat höchstens auf deinem Rechner etwas verloren, aber nicht im Internet
Auf diesen Beitrag antworten »
Karlito

Hallo tigerbine,

hoher Besuch vom Matheboard? Augenzwinkern

Aaalso: ich habe mal ein wenig rumprobiert. Es ist immer notwendig, die Ausführung des Java-Plugins für Firefox und Chrome freiz zu geben. Dazu erscheint normalerweise eine Freigabenachfrage. Wenn nicht, im Firefox die Tastenkombination "Strg-Shift-A" betätigen (Vorher auf irgendeine freie Fläche im Browser Klicken). Dann Unter Plugins das Java-Plugin aktivieren.

Unter Windows ist es zusätzlich noch notwendig, Java zu erlauben, Applets auszuführen. Dazu in der Windows-Systemsteuerung -> Java im Reiter "Sicherherit" den Pfad des Applets zur Ausnahmeliste hinzufügen. Alternativ (nicht zu empfehlen), sollte auch die Herabesetzung der Sicherheitsstufe funktionieren.

Allgemein ist zu sagen: Die Entwicklung von Java-Applets ist mittlerweile nicht mehr zu empfehlen. Wenn es geht sollten andere Technologien Anwendung finden. Beispielsweise HTML5 + JavaScript...

Bei Rückfragen, einfach rückfragen Augenzwinkern

Edit: der nicht geschlossene <p>-Tag ist definitiv ein Fehler. Vielleicht ist es besser das Oracle-Tutorial zu verwenden: http://docs.oracle.com/javase/tutorial/d...plet/index.html

VG,

Karlito
Auf diesen Beitrag antworten »
tigerbine

Danke an Euch. :wave:

Es ist ein zugegeben schon älteres Lehrbuch, also sicher vor HTML5. Leider auch mit einigen Tippfehlern, aber es liest sich für einen Einsteiger ganz gut, gerade weil es in Tageslektionen aufgebaut ist.

Dann teste ich die Beispiele nur im Applet Viewer, eh ich da Tür und Tor für was aufmache ...

Für HTML5, CSS3 und Java Script liegt schon ein anderes Buch bereit :-)

Da habe ich ein anderes Problem. --> neuer Thread? Oder im OT erlaubt?

Ich bin auch in Linux unterwegs, aber nicht als root. Der Xampp Server hat nun seine Verzeichnisse so gelegt, dass man Rootrechte braucht.

Als BestPractise habe ich den Umweg über den Dokumente-Ordner genommen. Dort schreibe ich das Coding mit gedit und kopiere es über den Terminal mit Rootrechten (sudo su, oder so ...) in den xampp ordner.

Habe ich irgendwie die Möglichkeit meinem Account mehr Rechte zu geben? Bei der Anmeldung kann ich nur mich oder Gastzugang auswählen.
 
Auf diesen Beitrag antworten »
Karlito

Hallo tigerbine,

Du kannst hier gerne Deine Fragen fortsetzen und brauchst keinen neuen Thread aufmachen.

Ich bin leider nicht so fit, was admin-Geschichten angeht. Eine einfache Variante, um ein Verzeichnis in XAMPP für Testzwecke freizugeben ist in deinem Homeverzeichnis ein Verzeichnis "public_html" (oder beliebig anders) anzulegen und im www-Ordner des XAMPP einen link darauf anzulegen.

Ich gehe mal davon aus, dass du Ubuntu oder Debian am laufen hast. Dort ist es normalerweise so, dass der Webserver unter dem Benutzer und der Gruppe www-data läuft. Somit geben wir der Gruppe www-data zugriff auf eines unserer Verzeichnisse und binden dies per Symbolischen Link in das Dokumentenverzeichnis von Apache ein (normalerweise /var/www)

Beispiel:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
cd ~                                    # wechsel in das home-verzeichnis
mkdir public_html
chown tigerbine:www-data public_html    # anpassung der Besitzmerkmale
chmod 755 public_html                   # berechtigungen für den zugriff auf das Verzeichnis
touch public_html/index.html            # anlegen einer index-datei, damit das verzeichnis nicht aufgelistet wird
chmod 644 public_html                   # anpassung der zugriffsrechte auf die index.html
sudo ln -s tigerbine /var/www/tigerbine # anlegen eines symbolischen links zu dem neuen verzeichnis


Ich hoffe das passt.

VG,

Karlito
Auf diesen Beitrag antworten »
ed209

Hi Tigerbine Wink

Eine einfache Lösung unter Ubuntu wäre gksudo, das funktioniert wie sudo aber eben für graphische Anwendungen.
Aber denk dran, es nur für simple Programme zu verwenden die zur Distribution gehören (gedit sollte kein Sicherheitsrisiko sein, also kein Problem).

Alternativ könntest du die Verzeichnisse die Du brauchst einer Gruppe zuordnen und dann deinen Benutzer dieser Gruppen hinzufügen. (Hab ehrlich gesagt selber keine Ahnung wie man das macht, aber gibt es Anleitungen zu im Internet).

Meine persönliche Lösung ist, einen Kommandozeilen-Editor zu benutzen. (vim ist besser als emacs). Damit ist man langfristig flexibler, aber das ist eine große Umgewöhnung.

Gruß,
ED209 (ehemals known as PrototypeX29A im Matheboard)

PS: Ich hatte gehofft Applets wären tot.
Auf diesen Beitrag antworten »
tigerbine

Danke für eure Antworten. :-)

Dann kann ich Applet Lektionen aus dem java-Buch ja streichen.

xampp ist für html5/css3/javascript Buch gedacht.
Auf diesen Beitrag antworten »
tigerbine

In einem anderen JAVA Buch lese ich etwas von Swing, Servelts, DAtenbankprogrammierung. Die Themen sind im Gegensatz zu Applets noch aktuell?
Auf diesen Beitrag antworten »
eulerscheZahl

Swing: graphische Benutzeroberfläche
Servlets: Java-Programme, die auf einem Server laufen, um eine Seite zu generieren (nach dem Prinzip funktionert z.B. die auf dich zugeschnittene Ergebnisseite einer Suchmaschine).

Ich kann dir leider nicht sagen, ob man dafür gewöhnlich Java verwendet (im Studium haben wir mal ein wenig mit JSP gearbeitet), die Themen selbst sind aber auf jeden Fall noch aktuell.
Auf diesen Beitrag antworten »
tigerbine

Danke.

Dann hätte ich eine konkrete Frage.

ich möchte mir eine Benutzereingabe (Buchstabe) auch als Buchstaben wieder ausgeben lassen.

Nun habe ich gelesen, dass System.in.read() aber einen Integer-Wert liefert. Wie wandle ich diesen um, so dass ich mit System.out.println wieder den eingegebenen Buchstaben sehe?
Auf diesen Beitrag antworten »
eulerscheZahl

Ein int hat 32 Bit, wie willst du da einen ganzen String reinbringen?
mit read() geht es nicht, da werden nicht einmal Buchstaben zugelassen

Du brauchst einen Reader:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) {
	    InputStreamReader isr = new InputStreamReader(System.in);
	    BufferedReader br = new BufferedReader(isr);
	    System.out.print("Eingabe: ");
	    String eingabe = null;
		try {
			eingabe = br.readLine();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	    System.out.println(eingabe);
	}
}
Auf diesen Beitrag antworten »
tigerbine

Danke, verstehe den Code aber noch nicht. So weit bin ich noch nicht im Lehrbuch. geschockt

Kommt vielleicht ja noch. Augenzwinkern
Auf diesen Beitrag antworten »
Matze84

Ich persönlich kann dir da "Java ist auch eine Insel" in Version 7 empfehlen...

http://openbook.galileocomputing.de/javainsel/

Ich selbst habe mir das Buch gekauft, weil es dann einfacher zu lesen ist aber im OpenBook geht das auch gut. (Habe ich zumindest zu beginn gemacht, bevor ich mich zum Kauf entschieden habe)

Da wird das auch mit dem Reader, Swing, JDBC (Datenbanken in Java) erklärt oder zumindest angerissen.

XAMPP brauchst du für HTML5 / CSS3 / Javascript meines erachtens NICHT.

für diese 3 Sachen reicht theoretisch schon ein einfacher Editor wie z.B.
notepad++

XAMPP wird dann interessant, wenn du PHP und Datenbanken (Bsp.: MySQL) nutzen willst.
Auf diesen Beitrag antworten »
tigerbine

Danke für die Rückmeldung.

Ich hätte eine Frage zu Interfaces.

code:
1:
2:
3:
public interface SchokoRiegel {
boolean istLecker();
}


Was kann man damit machen. Ich dachte, Klassen können Interfaces implementieren.

code:
1:
2:
3:
4:
5:
public class SchokoLadenKeksGemisch implements SchokoRiegel {
@Override
public boolean istLecker(){
return true;
}


das heißt, das die Methode von dem Interface implementiert werden muss. Folgendes verstehe ich dann aber nicht.

code:
1:
2:
3:
4:
5:
public class SchokoladenSuechtiger {
public void essen (SchokoRiegel schokoriegel) {
if(schokoriegel.istLecker()) {
System.out.println("Boah, lecker");
}


Was soll SchokoRiegel schokoriegel ssein. Da kann man doch keine Instanz von bilden ... verwirrt
Auf diesen Beitrag antworten »
Karlito

Hallo,

ich finde das Beispiel ein wenig schlecht gewählt. Versuchen wir es mal mit einer anderen Analogie:

Alle Objekte, welche ein gemeinsames Interface haben, können in einer gewissen Art auf dem selben weg benutzt werden. So zum beispiel, Dinge, die man aufschließen kann. Alle implementieren ein Schloss...

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
 
public interface ISchloss {
	void aufschliessen();
}

public class Tresor implements ISchloss {
	@Override
	public void  aufschliessen(){
		// Ein sehr komplitierter Aufschliessalgorithmus
		System.out.println("Tja, leider ebbe hier.");
	}
}

public class Haus implements ISchloss {
	@Override
	public void  aufschliessen(){
		// Ein weniger komplitierter Aufschliessalgorithmus
		System.out.println("Willkommen im Haus");
	}
}


public class Main {
	public static void main(string[] args){
		Tresor tresor = new Tresor();
		Haus haus = new Haus();

		//beginne Raubzug
		schliesseAuf(Haus);		//Haus aufschliessen (Funktioniert, da Haus ein Schloss hat)
		schliesseAuf(Tresor); //Tresor auffschliesse (Funktioniert, da Tresor ein Schloss hat)
	}

	//Nimmt beliebige Objekte entgegen, die ein Schloss haben
	static void schliesseAuf(ISchloss ding){
		ding.aufschliessen();
	}
}


Anstatt das Interfache ISchloss zu nennen, hätte man es auch IAufschlissbar nennen können. Damit wird auch klar, dass alle Gegenstände, die das Interface implementieren aufschließbar sind.

Ich hoffe das macht es deutlich?

VG,

Karlito
Auf diesen Beitrag antworten »
tigerbine

code:
1:
2:
3:
//Nimmt beliebige Objekte entgegen, die ein Schloss haben
	static void schliesseAuf(ISchloss ding){
		ding.aufschliessen();


Da hänge ich wieder. Was bedeutet

code:
1:
(ISchloss ding)


Dachte hier wird was übergeben von Typ Ischloss. Also ding typisiert Ischloss. Und das geht für mich nicht. Haus oder Tresor wäre für mich gegangen. verwirrt
Auf diesen Beitrag antworten »
Karlito

Naja, ganz einfach gesprochen ist es vom Typ Schloss. Eben ein Schloss mit einem haufen Beton oder einem Metallkasten hinten dran. Es ist einfach eine Art der Abstraktion. In dem Fall beschränken wir uns eben nur auf die Sicht, dass es ein Schloss hat oder ist.... M;an schränkt also die Perspektive auf ein Objekt auf nur die Funktionalität, was das Interface bietet ein.

Jede Klasse, die ein Interface implementiert, kann eben bei Bedarf auf eben nur dieses Interface "reduziert" werden. Das ist immer dann nützlich, wenn Du noch nicht weißt, welche Objekte diese Schnittstelle bereit stellen werden. Man garantiert aber, dass alle diese Objekte in gleicher Art und Weise behandelt werden können, halt nur eingeschränkt auf das Interface.
Sollte das
Wenn das immernoch unverständlich ist, muss ich mal versuchen mir ein Beispiel auszudenken. Das wird dann aber bestimmt erst frühestens morgen. (Soweit nicht noch jemand anderes eine bessere Erklärung hat)

Edit: Folgendes kann man auch machen:
code:
1:
2:
3:
4:
ISchloss haus = new Haus():
ISchloss tresor = new Tresor();

Wenn jetzt die Klassen Haus und Tresor noch viele andere Funktionen bereit stellen würden, könnte man diese bei den Variablen haus und tresor nicht mehr benutzen. Man schränkt also die Sicht auf nur einen Teilaspekt ein, den die beiden Objekte gemeinsam haben.

VG,

Karlito
Auf diesen Beitrag antworten »
ed209

code:
1:
2:
3:
public interface SchokoRiegel {
boolean istLecker();
}


Hier definierst du SchokoRiegel als etwas, das lecker ist oder halt nicht.
D.h. für jede Klasse die das Interface SchokoRiegel implementiert musst du eine methode istLecker implementieren, die true oder false zurückgibt.

code:
1:
2:
3:
4:
5:
public class SchokoLadenKeksGemisch implements SchokoRiegel {
@Override
public boolean istLecker(){
return true;
}


Hier erfindest du einen spezielle Form des SchokoRiegels mit dem Namen SchokoLadenKeksGemisch.
"SchokoLadenKeksGemisch implements SchokoRiegel" bedeutet in diesem Fall "SchokoLadenKeksGemisch ist eine spezielle Form von SchokoRiegel".


code:
1:
2:
3:
4:
5:
public class SchokoladenSuechtiger {
public void essen (SchokoRiegel schokoriegel) {
if(schokoriegel.istLecker()) {
System.out.println("Boah, lecker");
}


Und warum das ganze? Damit Du jetzt deinem SchokoladenSuechtigen eine beliebige SchokoRiegel-Klasse übergeben kannst, ohne dass dabei im Vorfeld klar sein muss um welche Form von SchokoRiegel es sich handelt.

Ich kann jetzt zum Beispiel eine weitere SchokoRiegel-Implementierung schreiben und sie funktioniert mit dem Rest des Programms, ohne dass du sie vorher gekannt hast als Du deinen SchokoladenSuechtiger geschrieben hast.

code:
1:
2:
3:
4:
5:
6:
public class KnoblauchFischRiegel implements SchokoRiegel
@Override
public boolean isLecker() {
  return false;
}


Anstatt dass du eine Instanz von SchokoRiegel direkt machst, machst du dann Instanzen von Klassen die das Interface implementieren. Zum Beispiel:

code:
1:
2:
3:
4:
5:
6:
7:
8:
public static void main(String args[]) {
   SchokoladenSuechtiger tigerbine = new SchokoladenSuechtiger();
   SchokoRiegel einRiegel = new KnoblauchFischRiegel();
   SchokoRiegel nochEinRiegel = new SchokoLadenKeksGemisch();
   tigerbine.essen(einRiegel);
   tigerbine.essen(nochEinRiegel);
}


Für Tippfehler übernehme ich keine Haftung Augenzwinkern

Auch wenn es sich um zwei konkrete Arten von Riegeln handelt, kannst Du im Code dann davon abstrahieren und mit generischen Schokoriegeln rumhantieren.

Gruss,
ED
Auf diesen Beitrag antworten »
tigerbine

Zitat:
Original von ed209
code:
1:
2:
3:
public interface SchokoRiegel {
boolean istLecker();
}


Hier definierst du SchokoRiegel als etwas, das lecker ist oder halt nicht.
D.h. für jede Klasse die das Interface SchokoRiegel implementiert musst du eine methode istLecker implementieren, die true oder false zurückgibt.

--> check

code:
1:
2:
3:
4:
5:
public class SchokoLadenKeksGemisch implements SchokoRiegel {
@Override
public boolean istLecker(){
return true;
}


Hier erfindest du einen spezielle Form des SchokoRiegels mit dem Namen SchokoLadenKeksGemisch.
"SchokoLadenKeksGemisch implements SchokoRiegel" bedeutet in diesem Fall "SchokoLadenKeksGemisch ist eine spezielle Form von SchokoRiegel".

--> Spezielle Form? Wie würdest du dann "extends" beschreiben? Sagen wir allgemeine Klasse Keks und SchokoLadenKeksGemisch extends Keks. Kann nun wortklauberei sein, sorry. Ich denke du verstehst scho, wie ich das meine.

code:
1:
2:
3:
4:
5:
public class SchokoladenSuechtiger {
public void essen (SchokoRiegel schokoriegel) {
if(schokoriegel.istLecker()) {
System.out.println("Boah, lecker");
}


Und warum das ganze? Damit Du jetzt deinem SchokoladenSuechtigen eine beliebige SchokoRiegel-Klasse übergeben kannst, ohne dass dabei im Vorfeld klar sein muss um welche Form von SchokoRiegel es sich handelt.



Ich kann jetzt zum Beispiel eine weitere SchokoRiegel-Implementierung schreiben und sie funktioniert mit dem Rest des Programms, ohne dass du sie vorher gekannt hast als Du deinen SchokoladenSuechtiger geschrieben hast.

code:
1:
2:
3:
4:
5:
6:
public class KnoblauchFischRiegel implements SchokoRiegel
@Override
public boolean isLecker() {
  return false;
}


Anstatt dass du eine Instanz von SchokoRiegel direkt machst, machst du dann Instanzen von Klassen die das Interface implementieren. Zum Beispiel:

--> so hätte ich es eher erwartet. Vielleicht ist das Buchbeispiel dann nicht so... doll? ich muss mir aber auf jeden Fall wohl einfach merken, dass es auch Instanzen von Interfaces gibt, oder?

code:
1:
2:
3:
4:
5:
6:
7:
8:
public static void main(String args[]) {
   SchokoladenSuechtiger tigerbine = new SchokoladenSuechtiger();
   SchokoRiegel einRiegel = new KnoblauchFischRiegel();
   SchokoRiegel nochEinRiegel = new SchokoLadenKeksGemisch();
   tigerbine.essen(einRiegel);
   tigerbine.essen(nochEinRiegel);
}


Für Tippfehler übernehme ich keine Haftung Augenzwinkern

Auch wenn es sich um zwei konkrete Arten von Riegeln handelt, kannst Du im Code dann davon abstrahieren und mit generischen Schokoriegeln rumhantieren.

Gruss,
ED


Gruß,
tigerbine

eine weitere Frage, aber neues Java Problem

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
package de.galileocomputing.schroedinger.java.kapitel08;

public class SchuhTesterMitArray implements SolcheSchuheHastDuSchon{
	private SchuhPaar[] schuhe;
	private int schuhZaehler = 0;
	public SchuhTesterMitArray() {
		this.schuhe = new SchuhPaar[20];
	}
	
	@Override
	public void addSchuhPaar(SchuhPaar schuhe){
		if(this.schuhZaehler < this.schuhe.length){
			this.schuhe[this.schuhZaehler] = schuhe;
			this.schuhZaehler++;
		}
	}
	
	@Override
	public boolean hastDuSchon(SchuhPaar neuesSchuhPaar){
		boolean hastDuSchon = false;
		for (SchuhPaar schuhPaar : this.schuhe);
		 //....
		return hastDuSchon;
	}

}


code:
1:
for (SchuhPaar schuhPaar : this.schuhe);


Wird hier über den Array iterriert? Schreibt man dann die aktuelle Position in schuhPaar und kann somit damit "arbeiten" in dem //... Bereich?
Auf diesen Beitrag antworten »
Karlito

Zitat:
Original von tigerbine
--> Spezielle Form? Wie würdest du dann "extends" beschreiben? Sagen wir allgemeine Klasse Keks und SchokoLadenKeksGemisch extends Keks. Kann nun wortklauberei sein, sorry. Ich denke du verstehst scho, wie ich das meine.


Der Unterschied zwischen extends und implements ist, dass extends eine vorhandene Klasse spezialisiert. Ein SchokoLadenKeksGemisch ist ein spezieller Keks, da es alles was der Keks ist erbt und weitere Eigenschaften dazu kommen.
Implements beschränkt sich, wie ich schon versucht habe zu beschreiben, auf nur einen Teilaspekt des Objekts.

Zitat:
Original von tigerbine
--> so hätte ich es eher erwartet. Vielleicht ist das Buchbeispiel dann nicht so... doll? ich muss mir aber auf jeden Fall wohl einfach merken, dass es auch Instanzen von Interfaces gibt, oder?


Es gibt keine Instanzen von Interfaces. Es gibt nur Instanzen von Klassen, die Interfaces implementieren. Ein Objekt einer Klasse, die ein Interface implementiert, ist nur immer auch gleichzeitig vom Typ des Interfaces.

Was dir vielleicht noch nicht klar ist, ist das prinzip der Polymorphie. Wenn eine Klasse eine andere erweitert (extends) oder ein Interface implementiert, dann hat sie zusätzlich zu ihrem eigenen Typ noch die Typen der geerbten Klasse und des Interfaces.

VG,

Karlito
Auf diesen Beitrag antworten »
tigerbine

Danke. So langsam brauche ich wirklich mal nen Keks.

Kann mir noch jemand bei der Frage zur Iteration helfen?
Auf diesen Beitrag antworten »
eulerscheZahl

code:
1:
2:
for (SchuhPaar schuhPaar : this.schuhe)
    //tue etwas mit schuhPaar

Ist eine Schleife, mit der das Array schuhe durchlaufen werden kann. (Das Semikolon danach habe ich entfernt, sonst wird in der Schleife genau nichts getan und der Befehl danach nur einmal ausgeführt. In anderen Sprachen heißt die Schleife foreach.

Der Schleife ist sehr ähnlich zu der hier:
code:
1:
2:
(for int i = 0; i < this.schuhe.length; i++)
    //tue etwas mit this.schuhe[i]

Es gibt aber einen Unterschied: mit der ersten Variante kannst du nur lesend zugreifen, also nicht schreiben schuhPaar = <wasAuchImmer>;
Bei der zweiten Schleife ist das möglich.
Auf diesen Beitrag antworten »
tigerbine

Ja, der ; war falsch. Hab ich ewig gesucht. Danke. smile

Prima, Variante 2 hätte ich "geschrieben", aber du hast ja auch schon den Unterschied erklärt. Daumen hoch

Dann kann ich im Buch weitermachen.

Bis zur nächsten Frage Wink
Auf diesen Beitrag antworten »
tigerbine Deklaration

Ich muss nochmal an den Anfang zurückkehren. Datentypen. Denn in den Kurzschreibweisen scheine ich mich ein wenig zu verlieren.

Bei einfachen Datentypen gibt es doch im Grunde 2 Schritte, Deklaration und Wertzuweisung.

code:
1:
2:
 int height;
height = 5;


Bei erweiterten Datentypen sind dann 3 Schritte nötig: Deklaration, Erzeugung und Wertzuweisung

code:
1:
2:
3:
4:
char yesKey[];
yesKey = new char[2];
yesKey[0] = 'J';
yesKey[1] = 'A';


Ist das soweit korrekt? Und das kann man dann auch verkürzt schreiben?

Danke
Auf diesen Beitrag antworten »
eulerscheZahl

Ja, das ist richtig.
in kurz:
code:
1:
2:
int height = 5;
char yesKey[] = ("JA").toCharArray();

bzw. nur die ersten beiden Zeilen von yesKey:
code:
1:
char yesKey[] = new char[2];
Auf diesen Beitrag antworten »
tigerbine

Ok, wenn man viel schreibt ist einem sicher das Kurze lieber. Am Anfang muss ich mir die einzelnen Schritte immer wieder ins Gedächtnis rufen. Kommen wir noch zu den benutzerdefinierten Datentypen,

Wir haben eine Klasse rectangle. Nun sind wir in einer anderen Klasse. Dort muss das Deklariert und Erzeugt werden.

code:
1:
2:
Rectangle rect;
rect = new Rectangle();


Gibt es hier auch so was wie eine Wertzuweisung? Wäre das dann, wenn man dem Konstruktor Werte mitgibt/mitgeben könnte? Ich denke da z.B. an konkrete Abmessungen eines Rechtecks. Dann musste man aber erst gucken, ob der Konstruktor das macht? Also sehr salopp von mir formuliert.

Und in kurz dann

code:
1:
Rectangle rect  = new Rectangle();
Auf diesen Beitrag antworten »
eulerscheZahl

Ob du gleich Werte übergeben kannst, hängt vom Kopf des zugehörigen Konstruktors ab:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
public class Rectangle {

	private double width, height;
	
	//Konstruktor für Rectangle()
	public Rectangle(){
		this.width = 0;
		this.height = 0;
	}

	//Konstruktor für Rectangle(2,3)
	public Rectangle(double width, double height){
		this.width = width;
		this.height = height;
	}
	
	@Override
	public String toString(){
		return this.width + " * " + this.height;
	}

}


public class Main {

	public static void main(String[] args) {
		Rectangle rect1 = new Rectangle();
		Rectangle rect2 = new Rectangle(2,3);
		System.out.println("rect1 = " + rect1);
		System.out.println("rect2 = " + rect2);		
	}

}

Ausgabe:
code:
1:
2:
rect1 = 0.0 * 0.0
rect2 = 2.0 * 3.0
Auf diesen Beitrag antworten »
tigerbine

Danke. Wink
Auf diesen Beitrag antworten »
tigerbine

Nochmal zu den Konstruktoren. Kann eine Klasse auch mehrere haben? Oder wie ist folgender Codebzgl. public Rectangle(){} zu verstehen?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public class Rectangle{

  private int height =1;
  private int width = 1;
  public Rectangle(){}

  public Rectangle(int height, int width){
      this.height =  height;
      this.width = width;
  }
}
Auf diesen Beitrag antworten »
Karlito

Hallo tigerbine,

das Prinzip, dass es eine Methode mit dem selben Namen geben kann, welche verschiedene kombinationen von Parametern entgegen nimmt, nennt sich Überladung. Konstruktoren können auch überladen werden. Somit lautet die Antwort ja, es kann mehrere Konstruktoren für eine Klasse geben.

Edit: Der Code ist so zu verstehen, dass es einen Konstruktor gibt, welcher Höhe und Breite initialisiert und einen der dies nicht tut und somit die vorgegebenen Standardwerte übernimmt.

VG,

Karlito
Auf diesen Beitrag antworten »
tigerbine

Danke. Nun bin ich beim Thema casting für Zahlentypen und frage mich, ob ich die elementaren Datentypen falsch verstanden habe. Ich dachte mit byte, short, int, long kann man ganze Zahlen darstellen. Für Kommazahlen wurden nur in Form von Gleitpunktzahlen mit float, double, bigdecimal gehen.

Warum ist dann der Cat von einer Fließkommazahl eine Festkommazahl?

code:
1:
2:
3:
long a = 1234567890123456789L
float b = a // b=1.23456794E18
(long) b // (long) b=1.234567939550609408


Es geht mir hier nicht um die entstadene Ungenauigkeit, sondern wie eine Festpunktzahl möglich ist.

Danke :wave:
Auf diesen Beitrag antworten »
eulerscheZahl

Was hast du getan, um diesen Wert für (long)b zu bekommen?
code:
1:
2:
3:
4:
5:
6:
7:
public static void main(String[] args) {
	long a = 1234567890123456789L;
	float b = a; // b=1.23456794E18
	System.out.println(a); //1234567890123456789
	System.out.println(b); //1.23456794E18
	System.out.println((long)b); //1234567939550609408
}

Zitat:
Für Kommazahlen wurden nur in Form von Gleitpunktzahlen mit float, long, bigdecimal gehen.

ich hoffe, du meintest double, als du long geschrieben hast.
Auf diesen Beitrag antworten »
tigerbine

Das ist ein Beispiel aus "Einstieg in Java, Galileo Computing". Da habe ich einen Punkt vergessen
code:
1:
2:
3:
4:
5:
6:
7:
public static void main(String[] args) {
	long a = 1234567890123456789L;
	float b = a; // b=1.23456794E18
	System.out.println(a); //1234567890123456789
	System.out.println(b); //1.23456794E18
	System.out.println((long)b); //1.234567939550609408



Unten meinte ich double, ja.
Auf diesen Beitrag antworten »
ed209

Ich denke dein Verständnis von den Datentypen ist richtig.

Ich habs grad getestet und bekomme folgendes raus.
(long)b ist 1234567939550609408
und (double)b ist 1.23456793955060941E18

Java kennt nativ keine Festkommazahlen, lediglich float und double gemäß IEEE Standard schlagmichtot

Was auch immer in deinem Buch steht, es lohnt sich vielleicht da mit Tippex ranzugehen großes Grinsen
Auf diesen Beitrag antworten »
tigerbine

Ok, danke. Was mir in Codings immer wieder auffällt ist, dass viele Variablen gleich heißen. Das macht es für mich am Anfang etwas schwer zu wissen, welche welche ist.

Beispiel

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
public class StringBufferDemo {

   public StringBuffer string(){                                   //Instanzmethode mit Rückgabewert 
            StringBuffer str = new StringBuffer("String")  //Dekl.+Erz+Wertzuweisung
            for (int i=0; i<=10; i++){
                 str.append(str);                                    //Methode von str zur Verkettung
                 }
            return str;                                                 //Rückgabewert str
    }

    public static void main(String[] args){
    StringBufferDemo stretch = new StringBufferDemo //Dekl. + Erz. von Instanz 'stretch'
    StringBuffer str  = new StringBuffer()     //Dekl. Erzeugung von Instanz 'str'
   
    str = stretch.string();   //Wertzuweisung str = Rückgabewert str
    System.out.println("Ergebnis: " + str);
  } 
}


Habe ich das so richtig verstanden? Danke.
Auf diesen Beitrag antworten »
eulerscheZahl

Sieht gut aus smile

In Zeile 4, 12, 13 fehlt ein ;
Zeile 12: new StringBufferDemo(), also mit Klammern
Die Zeilen 13 und 15 könnte man auch zusammenfassen:
code:
1:
StringBuffer str  = stretch.string();

oder gleich die ganze main in einer Zeile (mit dem Nachteil, dass du danach nicht mehr auf den String zugreifen kannst, sondern ihn neu erzeugen müsstest):
code:
1:
System.out.println("Ergebnis: " + new StringBufferDemo().string());
Auf diesen Beitrag antworten »
tigerbine

Nächste Frage zu einem Algorithmus. Es soll ein Array sortiert werden. Das soll über zwei Schleifen gehen. Ich tippe einen Auszug erstmal ab.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
for(index = 0; index < (array.length-1); index++){
  for(int j=index; j<(array.length);j++){
    if (array[index]> array[j] {  //Vergleich
       temp = array[index]; //Zwischenspeicher Minimum
       array[index]=array[j]; // Minimum überschreiben
       array[j] = temp; //Vertauschung durch temporären Wert
  }
}


Was ich nicht verstehe

* beim Vergleich, ist da nicht in der ersten Runde index = j, und man erhält 'false' und hätte sich diese Prüfung sparen können?
* Warum Minimum, es wird doch der größere der beiden Werte gespeichert bzw. überschrieben?

Danke für eure Hilfe. smile
Auf diesen Beitrag antworten »
Karlito

Hallo tigerbine,

Zitat:
Original von tigerbine
* beim Vergleich, ist da nicht in der ersten Runde index = j, und man erhält 'false' und hätte sich diese Prüfung sparen können?


Ja, hätte man...

Zitat:
Original von tigerbine
* Warum Minimum, es wird doch der größere der beiden Werte gespeichert bzw. überschrieben?


Richtig verstanden. Die Kommentare sind quatsch.

Zitat:
Original von tigerbine
Danke für eure Hilfe. smile


Bitte Augenzwinkern

VG,

Karlito
Auf diesen Beitrag antworten »
tigerbine

Danke. Daumen hoch

Habe das nun auch mal mit dem Debugger nachvollzogen. Ist ja auch eine gute Übung für eine NewBee
Auf diesen Beitrag antworten »
tigerbine Deklaration

Ich habe da nochmal eine Frage zu. Ich habe eine Klasse Musiker, mit den Attributen name, alter und band, sowie einer Methode musizieren.

Davon leite ich eine Klasee Trompeter ab und überschreibe die Methode musizieren. Ansonsten kommt nichts neues hinzu. Wie kann ich einen Trompeter nun instanziieren?

code:
1:
 Tompeter trompeter = new Trompeter;


wäre für mich die logische Wahl. Warum geht aber auch

code:
1:
 Musiker trompeter = new Trompeter;


die beiden trompeter unterscheiden sich doch nun in der Deklaration. verwirrt Für mich passt der Konstruktoaurruf nicht zur Deklaration. Musiker hat doch gar keinen Konstruktior Trompeter. Und was wäre, wenn der Trompeter noch weitere Methoden hätte (mundstückWechseln oder so). Wie passt dies dann in die Deklaration Musiker rein.

Also kurz und knapp, mit was kann man alles eine Deklaration vornehmen (wenn man z.B. ein UML Diagramm vorsich hat)

Danke Wink
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »