Programmierklausurfragen

b1zarRe

Bekanntes Mitglied
Hi!

Ich schreibe in 2-3 Wochen eine ProgrammierKlausur und wollte hier einige Unklarheiten beseitgen:

Equals
Prinzipiell habe ich es so verstanden: Sobald, man etwas vergleichen will, wie zum Beispiel eine Menge von Elementen in einem Hashset: Dann muss man von der eigenst erstellten Klasse die Methode boolean equals(); von Object überschreiben, damit Hashset weiß, wann 2 Elemente gleich sind(nicht die selben, sondern gleich).

Wann muss man sonst noch Equals überschreiben??? Auch bei Hashmap oder Arraylisten? Oder prinzipiell nur, falls man etwas auf Gleichheit prüfen möchte??

Hashcode
Hashcode habe ich so verstanden, dass dies eine Art "Identifikationsnr" von einer Instanz sein kann. Jedoch muss gelten, dass sobald 2 Objekte equals gleich sind, auch den gleichen Hashcode haben müssen. 2 Instanzen welche den gleicehn Hashcode haben, müssen aber nicht unbedingt gleich sind...
Jedoch verstehe ich nicht, wofür man generell einen Hashcode brauch??? Ich meine mithilfe von Equals stellt man die Gleichheit schon fest?! Wozu brauche ich den Hashcode noch? Oder ist dies so eine Art "Positionierungsnummer" für ein HASHset, HASHmap etc?

Comparable & Comparator
Falls man das Interface Comparable implementiert, dann kann man auf "natürlicher Ordnung" mithilfe von überschriebener compareTo Methode in natürlicher Ordnung sortieren. Also sprich A vor B und 1 vor 2.. etc. Mithilfe eines erstellten Comparator Interfaces kann man hingegen(mit überschriebener compare Methode) eine eigne Reihenfolge(n) der Sortierung bestimmen. Lassen sich dadurch NUR Listen durch Collections.sort() sortieren? Oder auch Maps und Sets?

Sichtbarkeit
Private und public ist klar. Protected: Nur sichtbar innerhalb von Paketen richtig? Wieso benutzt man dann nicht einfach public? Also warum reicht public und private nicht schon aus?

Abstrakte Klassen und Interfaces
Abstrakte Klassen dienen einer (wie der Name schon sagt) Abstrahierung von Klassen und zwingen dazu, (bei Vererbung) alle abstrakten Klassen zu überschreiben, oder selbst als abstract zu deklarieren. Sowie werden alle Variablen oder Konstanten übernommen. Methoden können auch einen Rumpf besitzen. Interfaces hingegen implementiert man, und dort gibt es keine Methodenrümpfe und nur Konstanten. Warum reicht nicht eines davon? Beispielsweise nur Abstrakte Klassen?
Ist dies auch korrekt verstanden? Eine Klasse a hat, wenn sie eine abstrakte oberklasse hat, genau eine. aber diese klasse a kann beliebig viele interfaces implementieren?

Exceptions
Prinzipieller Ablauf klar... Jedoch, woher weiß ich, wenn ich die API gerade nicht benutzen kann, welche Exceptions eine Klasse haben könnte (welche weitergereicht oder gecatched werden müssten)? Nur durch vieles Programmieren oder gibs da eine Möglichkeit das "herauszufinden"

Streams
Auch hier verstehe ich leider nicht, warum es soviele verschiedene Klassen gibt. Warum hätte es nicht ausgereicht, eine Klasse InputStream zu haben und eine Outputstream (und die wichtigen Methoden in diesen Klassen). Diese beiden sind ja meines Wissens nach abstrakt, und werden benutzt von InputStreamReader beispielsweise welches Byteweise zeichenweise darstellt, oder?

Dynamische Bindung
Wäre nett, wenn mir hierzu einer etwas erläutern könnte? (ja, ich habe schon in 1-2 Bücher geschaut...)


Danke vielmals.... Ich habe alle Themen schonmal nachprogrammiert und schon dadurch vielmehr Verständnis hinzubekommen, jedoch würde ich gerne sehr gut vorbereitet in die Klausur gehen und nicht einfach nur das mit Equals und Hashcode beispielsweise ausführen, sondern auch Lernen, warum und wofür Hashcode beispielsweise genau da ist.

Danke euch!!!
 
Zuletzt bearbeitet:

Empire Phoenix

Top Contributor
1. Equals vergelich objecte mit der equals methode, richtig, da == nur überprüft ob es das selbe object ist(aber nicht ein gleiches), Hashset bracht das aber soweit ichw eiß nciht, glaube das bracht halt nur den Hash.

2. Stell dir bsp. eine Prüfsumme vor (aka md5 bei dateien). Kann man zb benutzen um auf schnelle methdoe wenn manv iele objecte vergleicht rauszufinden welche man überhaupt verleichen muss (Statt alles mit allem nur welche mit identischer Has)

3. im wesentlichen so,ja wobei das nicht umbedingt eine logische ordnugn wie 123 sein muss, zb Kann man Personen anch name oder nach Gebursdatum sortieren, order nach name und dann anch gebursdatum, je nachdem wie man das braucht kann man das halt implementieren.

4. Stell dir ein grosses softwareprojet cor, dort haste nen package für eine logic, das was die anderen programmiere davon benutzen sollen macht man dann auf public und das für das package selber afu protected(statt public)

5.Genau aus dem grund der einfachvererbung ist es nötig auch interfaces zu haben. Abstracte kalssen sidn ganz praktsich wenn man weis dass alle untertypen die selbe methode benutzen müssen.(und man die somit nicht überall copy paste reinmachen muss.

6 Im zweielsfall kann man einfach try catc mit Exception machen, das fängt dann alle.
-> Checked exception (alles was von Exception erbt) muss gefangen werden, dies wird der java compiler erzwingen
-> Unchecked exeption (aka RuntimeException) werden vom compiler nicht erzwungen, beispiel hierfür ist ein division durch zero, diese fehler sind programmierfehler eigentlich, und sollen korrigiert nciht abgefangen werden.

7. Weil die unterschiedliches können. Zb. kann ich einen Objectinputstrem auf einen Inputstrem packen, und dann damit serialisierte Java objecte lesen. Das gesamt Stream system ist eigentlich sehr schön was vererbung angeht. (Vor allem der Inputstrem währe sonst sehr überladen)

8. Bin ich mir nciht ganz sicher in welchen sinne die Frage zu erstehen ist.
 

b1zarRe

Bekanntes Mitglied
Danke @ Empire Phoenix

1. Aber falls ein ObjectA == ObjectB ist, dann müssten die beiden doch auch a.equals(b) true sein oder???
2. Also benötigt man Hashcodes, um schneller nach dem "Inhalt" suchen zu können, als zuerst nach der Gleichheit und dann nach dem Inhalt???
6. Also ist der Grund von Interfaces das Nachträgliche Hinzufügen von "Mehrfachvererbungen" (Aber halt nur Konstanten und Methodenköpfe)???
8. Beispiel:
Man hat eine Oberklasse "Artikel" mit Methoden sucheBegriff(String begriff). Sowie weitere Klassen "CD","DVD","Buch", welche alle von "Artikel" erben. Die Methode sucheBegriff wurde überall überschrieben, und soll halt, passend ob nun cd, dvd oder Buch gemeint ist, schauen, ob sie diesen Artikel mit dem übergebenen Begriff enthält. Wäre folglich folgendes eine "Dynamische Bindung" ? ->

Java:
public static void main(String[]args) {

Artikel artikel;

artikel = new Buch("Das Labyrinth");
artikel = new DVD("Inglorious Basterds");
artikel = new CD("Black Sabbath");

artikel.sucheBegriff("Metallica");

}

Woher weiß nun die letzte Zeile, dass sie in der Klasse CD suchen muss, und nicht zb. in Buch oder DVD??? Liegt es daran, dass die letzte Zeile direkt vor "new CD("Black Sabbath");" kommt und deswegen dort sucht? Wäre die letzte Zeile vor dieser geschrieben worden, würde dann artikel in der Klasse DVD suchen?
 

Antoras

Top Contributor
hashCode() gibt es soweit ich weiß nur wegen den Hash*-Collections. Das steht zumindest auch in der API:
Object#hashCode hat gesagt.:
Returns a hash code value for the object. This method is supported for the benefit of hashtables such as those provided by java.util.Hashtable.

Ich halte sowohl equals() als auch hashCode() für eine Fehlimplementierung. Diese sollten über Interfaces zu einem Objekt hinzugelinkt werden können und nicht schon vorimplementiert sein. Genau das gleiche mit toString(), aber das ist ein anderes Thema.
Was die Unterschied zwischen equals() und hashCode() sind und wie diese genau implementiert werden sollen kannst du eigentlich auch über Google rausfinden.
--
Abstrakte Klassen bieten gegenüber einem Interface die Möglichkeit einer Default-Implementierung der Verhaltensweisen eines Objektes. Mehr dazu hier.
--
Dynamsiches Binden (Dynamic Dispatch) bezeichnet den Vorgang, eine Implementierung je nach zugrunde liegendem Typ (erst zur Laufzeit) auszuwählen.
In Bezug zu deinem Codebeispiel bedeutet das, dass erst zur Laufzeit entschieden werden kann was für ein konkreter Typ sich hinter artikel verbirgt (wobei dein Beispiel zu trivial ist, weshalb man dort sofort erkennen kann welche Implementierung genommen wird).
--
Anhand der Methodenköpfe können nur CheckedExceptions definitiv erkannt werden (da diese im Kopf angegeben werden müssen). Ob in einem Codestück UncheckedExceptions auftreten können kann man - ohne die API oder den Code zu kennen - allerdings nicht wissen.
 

thorstenthor

Bekanntes Mitglied
Ich halte sowohl equals() als auch hashCode() für eine Fehlimplementierung. Diese sollten über Interfaces zu einem Objekt hinzugelinkt werden können und nicht schon vorimplementiert sein. Genau das gleiche mit toString(), aber das ist ein anderes Thema.

die "standardmäßige" Implementierung von equals ist nicht einfach funktionslos (steht in der API), sie vergleicht Objekte auf "Identität" - bei den anderen ist es ähnlich

Dynamisches Binden: zur Laufzeit wird entschieden, welche Methode..

es gibt aber noch eine zusätzliches Binden zur Übersetzungszeit
 

thorstenthor

Bekanntes Mitglied
und Sieben von Acht Fragen stehen in der Insel: Galileo Computing :: Java ist auch eine Insel –

ich finde das gar nicht so uninteressant zu lesen:rtfm:

referenzielle und inhaltliche Gleichheit z.B.

zu "dynamische Bindung" gibt es viel im Netz, dies ist glaub ich relativ neu:

http://de.wikipedia.org/wiki/Dynamische_Bindung hat gesagt.:
In der Informatik, speziell der objektorientierten Programmierung, ist die Dynamische Bindung (engl. dynamic binding/dynamic dispatch) ein Begriff, der den Umgang des Compilers mit polymorphen Methoden beschreibt.

Man spricht von dynamischer Bindung, wenn ein Methodenaufruf zur Laufzeit anhand des tatsächlichen (dynamischen) Typs eines Objektes aufgelöst wird.
- Dynamische Bindung ? Wikipedia

also dann sehr viel Erfolg für die Klausur
 

b1zarRe

Bekanntes Mitglied
@thorstentor

genau das verstehe ich leider nicht...: "Zur Laufzeit wird es entschieden"... Konkret für mein Beispiel: Warum wird da die CD durchsucht und nicht etwas anderes? Kann zu späterer Zeit doch in einer anderen klassen gesucht werden? Hängt dies vom Suchbegriff ab oder in welcher Postion die sucheBegriff() ausgeführt wird...?

... ist das Ironie? :p
Meiner Meinung nach, bin ich schon relativ gut vorbereitet, gehe "nurnoch" Verständnisfragen durch, um wirklich sicher zu gehen, was ich da tue, falls nicht Codebeispiele sondern Verständnisfragen auftauchen! Und Javainsel hatte ich mir schon durchgelesen, ebenso Kopf bis Fuß und jetzt Java Handbuch der Programmierung ;) Also, bin definitiv nicht zu Faul dafür... nur beispielsweise wurde das in unserem Skript mit einem Satz beschrieben, was HashCode sein soll (und auch nach 3x lesen wurde ich nicht schlau daraus) und zb. Im Handbuch der Java Programmierung wird dasauch nur kurz erwähnt....

Deswegen ist ja ein Forum sinnvoll... damit man noch bestehende Fragen klären kann.... Wenn jeder hier schreiben würde "lies das in einem Buch nach" dann bräuchte man keine Foren ;). Aber danke dennoch :)
 
Zuletzt bearbeitet:

b1zarRe

Bekanntes Mitglied
Nunja, dass bei Wiki lässt ja eine Erweiterte For Schleife durch alle Elemente durchlaufen und es werden dann quasi von jedem Objekt die geerbte/überschriebene Methode aufgerufen.

Das unterscheidet sich aber von meinem Beispiel.... Bei mir ist eher der Konflikt: Welche Methode wird aufgerufen, warum und welche nicht... Wenn ich zb. nach einer CD suche mit Titel xyz, dann wäre es halt blöd, wenn dies halt von den Buchklassen gesucht wird.
 
M

Marcinek

Gast
Es wird immer die Methode der sich am unteresten befindlichen Klasse aufgerufen, die diese Methode implementiert.

Implementiere eine einfache Klasse und überschreibe die toString() Methode. Dann siehst du es.
 

Kel

Aktives Mitglied
5.Genau aus dem grund der einfachvererbung ist es nötig auch interfaces zu haben. Abstracte kalssen sidn ganz praktsich wenn man weis dass alle untertypen die selbe methode benutzen müssen.(und man die somit nicht überall copy paste reinmachen muss.
Bei Abstrakten Klassen und Interfaces muss man doch Copy+Paste bei allen Unterklassen machen, weil man die Methoden dort implementieren muss?
 
G

Gast2

Gast
Bei Abstrakten Klassen und Interfaces muss man doch Copy+Paste bei allen Unterklassen machen, weil man die Methoden dort implementieren muss?

Bei einem Interface schon, da muss jede Klasse die das Interface implementiert natürlich auch die Methoden implementieren. Bei Klassen die von Abstrakten Klassen erben müssen nur die als [c]abstract[/c] definierten Methoden überschrieben werden:

Java:
public abstract class Test {

	public abstract void method1();
	
	public void method2() {
		System.out.println("blub");
	}		
}

Java:
public class Test2 extends Test  {

	@Override
	public void method1() {
		System.out.println("blub");	
	}
	
	public static void main(String[] args){
        Test2 test2 = new Test2();
        test2.method1();
        test2.method2();
    }
}
 

Neue Themen


Oben