Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Sonstiges » Off-Topic » Java Applet » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Seiten (4): « vorherige 1 [2] 3 4 nächste » Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Java Applet
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
tigerbine
Grünschnabel


Dabei seit: 03.06.2007
Beiträge: 2

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
29.01.2014 20:14 tigerbine ist offline Beiträge von tigerbine suchen Nehmen Sie tigerbine in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
29.01.2014 20:52 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
ed209
Routinier


Dabei seit: 07.09.2006
Beiträge: 324

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
29.01.2014 23:23 ed209 ist offline E-Mail an ed209 senden Beiträge von ed209 suchen Nehmen Sie ed209 in Ihre Freundesliste auf
tigerbine
Grünschnabel


Dabei seit: 03.06.2007
Beiträge: 2

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von tigerbine: 30.01.2014 15:21.

30.01.2014 15:17 tigerbine ist offline Beiträge von tigerbine suchen Nehmen Sie tigerbine in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
30.01.2014 15:32 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
tigerbine
Grünschnabel


Dabei seit: 03.06.2007
Beiträge: 2

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke. So langsam brauche ich wirklich mal nen Keks.

Kann mir noch jemand bei der Frage zur Iteration helfen?
30.01.2014 15:59 tigerbine ist offline Beiträge von tigerbine suchen Nehmen Sie tigerbine in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
30.01.2014 16:43 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
tigerbine
Grünschnabel


Dabei seit: 03.06.2007
Beiträge: 2

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von tigerbine: 30.01.2014 16:50.

30.01.2014 16:49 tigerbine ist offline Beiträge von tigerbine suchen Nehmen Sie tigerbine in Ihre Freundesliste auf
tigerbine
Grünschnabel


Dabei seit: 03.06.2007
Beiträge: 2

Deklaration Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
31.01.2014 20:32 tigerbine ist offline Beiträge von tigerbine suchen Nehmen Sie tigerbine in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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];


__________________
Syntax Highlighting fürs Board (Link)
01.02.2014 07:38 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
tigerbine
Grünschnabel


Dabei seit: 03.06.2007
Beiträge: 2

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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();

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von tigerbine: 01.02.2014 11:12.

01.02.2014 11:05 tigerbine ist offline Beiträge von tigerbine suchen Nehmen Sie tigerbine in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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


__________________
Syntax Highlighting fürs Board (Link)
01.02.2014 11:36 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
tigerbine
Grünschnabel


Dabei seit: 03.06.2007
Beiträge: 2

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke. Wink
01.02.2014 12:00 tigerbine ist offline Beiträge von tigerbine suchen Nehmen Sie tigerbine in Ihre Freundesliste auf
tigerbine
Grünschnabel


Dabei seit: 03.06.2007
Beiträge: 2

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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;
  }
}
02.02.2014 21:25 tigerbine ist offline Beiträge von tigerbine suchen Nehmen Sie tigerbine in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
03.02.2014 00:25 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Seiten (4): « vorherige 1 [2] 3 4 nächste » Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Sonstiges » Off-Topic » Java Applet