Ein paar Fragen zu OOP und Java.

TJava

Bekanntes Mitglied
Hallo ich schreibe bald eine Klausur in OOP und möchte gerne ein paar Fragen stellen.
Im Laufe der Zeit wird dann hier ein Fragenkatalog entstehen

Und hier kommt die erste.

1) Erklären Sie den Unterschied zwischen Kopieren und Klonen.

Kopieren:
Werte werden kopiert, sie besitzen keine Identität.

Klonen:
Objekte werden geklont, sie besitzen eine Identität. Ein geklontes Objekt ist ein Objekt mit anderer Identität, aber mit selben Eigenschaften.

richtig?

MfG
 
Zuletzt bearbeitet:
Bei einer Kopie B von Objekt A, hat nach einem Verständnis jede Änderung von B auch identische Auswirkungen auf A.

Beim Klonen ist B ein eigenständiges Objekt, was A in seinen Eigenschaften gleicht. Änderungen an B haben keine Auswirkung auf A.

In Java gilt standardmäßig folgendes bei der Benutzung von Object.clone().

Hier wird zwar das Objekt geklont ABER je nach Typ der Klassenvariablen des Objektes A können Änderungen an Klassenvariablen in B auch auf A Auswirkungen haben. Man spricht von einer flachen Kopie.
[...] this method creates a new instance of the class of this object and initializes all its fields with exactly the contents of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned. Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation.

Dürfte aber für deine Frage eher unerheblich sein.
 
Danke!

2) Wie wird versehentliches Überschreiben in Java und C++ verhindert?

Java:
Final

C#:
Sealed

Gruss
 
Zuletzt bearbeitet:
Was ist der Unterschied zwischen Abstraktion und Spezialisierung?

Abstraktion:
Wird genutzt um konzeptionelle Dinge in einer Oberklasse zusammenzufassen.
Methoden/Operation in Oberklasse sind allen Unterklassen nutzbar.

Sind Methoden nicht in Unterklassen allgemein Nutzbar, kommen sie in der Oberklasse als abstrakte Methoden vor.
In den Unterklassen werden abstrakte Methoden der Oberklasse in ihren unterschiedlichen Ausprägungen implementiert.

Spezialisierung:
Eine Spezialisierung einer Oberklasse bedeutet, dass die Unterklasse die Oberklasse ersetzen kann.
Es geht um Wiederverwendbarkeit der Oberklasse und extra vorgesehene Erweiterungsmöglichkeiten.

Kann mir jemand die Unterschiede etwas genauer erklären?
 
Leider nein. Ich verstehe auch den wirklichen unterschied nicht.

Abstraktion ist halt das man versucht die Oberklasse mit dingen zu füllen die auch in den Unterklassen verwendet werden. Man geht davon aus das es mehrere Unterklassen gibt.

Spezialisierung geht davon aus das es nur eine Unterklasse gibt und die Unterklasse auch die Oberklasse ersetzen kann soll.
Es werden extra Lücken gelassen um im der speziellen Klasse gefüllt zu werden.
z.b. Thread bietet die run()-Methode an.

Aber hätte gerne eine "offizielle" Erklärung dazu. Das sind halt die Dinge die ich darunter verstehe.
 
Spezialisierung geht davon aus das es nur eine Unterklasse gibt und die Unterklasse auch die Oberklasse ersetzen kann soll.
Eine Unterklasse soll eine Oberklasse nicht ersetzen, sondern erweitern. Daher lautet das Schlüsselwort für die Vererbung auch extends.

"Offizielle Erklärungen" zu Java findest du in den Java Specs bei Oracle und den dazugehörigen Dokus bzw. Tutorials.
 
Aber in ihrer Verwendung ersetzt die speziellere, die allgemeinere Klasse.
Und vor allem kann die Unterklasse das. Subtyping etc.
 
Zuletzt bearbeitet:
Prinzipiell ist die Sache mit der Abstraktion relativ einfach ,

Stell dir einfach vor es wäre eine Art "Sammelbegriff" für Elemente eines Typs, welche eben konkretisierte Subtypen haben

Hier mal ein Beispiel anhand eines Dokuments :

Java:
public abstract class Dokument{...}

in diesem Fall wäre Dokument die Abstraktion, der Dinge ( oder auch Typen ) die eine is-a beziehung hierzu hätten,

hier erläutert an dem Beispiel der Klasse Zeugnis :

Java:
public class Zeugnis extends Dokument{...}

wie du sehen kannst wird hier das Schlüsselwort
Code:
extends
verwendet , um dementsprechend zu deklarieren das Zeugnis eine Konkretisierung , oder auch Spezialisierung von Dokument ist, und diese Abstraktion um einen Spezialisierten Typ erweitert.

Code:
Zeugnis [COLOR="red"][I]is-a[/I][/COLOR] Dokument
, also
Code:
Zeugnis [B]ist ein[/B] Dokument.

Überall wo du diesen Vergleich anwenden kannst macht Vererbung auch Sinn, ob es dann im Speziellen die beste Lösung ist , ist Situationsabhängig, da man sich einerseits auf Abstraktionen stützen soll und oder möglichst gegen Schnittstellen Programmieren, anderer seits wiederum soll man die Komposition der Vererbung vorziehen.

Was das jetzt für die Flexibilität bedeutet :

Angenommen du hättest eine Methode , die dir ein beliebieges Dokument mit einem Titel versehen soll,

Code:
public void createTitle(String title, Dokument dokument){...}

so ist diese Methode so deklariert, (da hier die Abstraktion als Parameter angegeben ist) das du Ihr jede Art von Typ übergeben kannst , der eine Konkretisierung , bzw. Spezialisierung von Dokument ist.

hättest du jetzt keine Abstrakte Superklasse, und würdest keine Vererbung nutzen , müsstest du für jeden Dokumenttyp eine eigene Methode anbieten

Java:
public void createTitle(String title, Zeugnis zeugnis){...}

public void createTitle(String title, Brief brief){...}

usw. usw.
 
Zuletzt bearbeitet:
Danke für alles bisher 😀

Jetzt kommt etwas was ich in der Anwendung nicht verstehe.
63xf1t.jpg



Wie versteht ihr das und wo ist der Sinn?
Kann mir jemand dazu ein Anwendungsbeispiel nennen?


Java:
public class Kunde {
	public void info(){
	  Vertreter v ;
	  v.abschließen();
	}
}

Java:
public class WiesSollteDieseKlasseHeißen? {
	
	class Versicherung {
		class Agent implements Vertreter {
			@Override
			public void abschließen() {
				System.out.println("test");
			}
		}
	}
}

Java:
public interface Vertreter {	
	void abschliessen();
}
 
Zuletzt bearbeitet:
Java:
public class Kunde {
	public void info(){
	  Vertreter v ;
	  v.abschließen();
	}
}
Also der Code ist schon mal "falsch"
  1. Gibt es IMMER eine NPE; da
    Code:
    v
    nicht gesetzt ist.
  2. Sind Sonderzeichen wie "ß" in Methoden-, Klassen- oder Variablennamen immer eine schlechte Idee. Nimm lieber a-zA-Z0-9_$, damit kommt jeder Zeichensatz klar.

Könntest du zu dem übrigen Code bitte schreiben, WAS genau du nicht verstehst?
 
Ohh sorry habe nicht gesehen das der Uplaod nicht geklappt hat.
Ich versuche im allgemeinen diese Folie zu verstehen.

Dort steht Kunden sehen nur den Agenten- nicht das Institut.
?????:L???:L???:L

Die NPE ist mir klar, möchte nur wissen in wie fern der Kunde da nichts sieht.
Verstehe den Zusammengang nicht.
 
Zuletzt bearbeitet:
Da niemand die Frage beantworten kann oder möchte.

Kommt hier die nächste:

Was bedeutet Record-Typen oder Record-Werte?
veränderliche und unveränderliche Record-Werte/-Typen?
 
Code:
    public class Versicherung {
        class Agent implements Vertreter {
            @Override
            public void abschließen() {
                System.out.println("test");
            }
        }
    }
so könnte man es machen, und da hast du auch gleich dein Beispiel. Aber ganz ehrlich, ich würde das so nie programmieren.
Das macht evtl Sinn, wenn die innere Klasse ohne der Äußeren so wirklich gar keinen Sinn ergibt.
Aber innere klassen tragen immer start zur Verwirrung bei, gönn dem Agenten doch eine eigene Klasse... auch wenn es keine Agenten ausserhalb von Versicherungen geben kann, ist die extra Datei doch kein Hindernis...
 
Hallo Montag ist Klausur dann habt ihr auch wieder Ruhe 😀

Untertyprelation für Arrays mit unveränderlichen Elementen [ Ind ] of El:
Ind ist der Indextyp, El der Elementtyp.
[ Ind’ ] of El’ <: [ Ind ] of El wenn Ind <: Ind’ (kontravariant) und El’ <: El (kovariant)

Bedeutet das:
T: Object [10] t = new Object();
T': String [10] t'= new String();

Index ist hier bei T Object und bei T' String. Was aber falsch wäre. Ich verstehe nicht was es für eine Rolle spielt, da das Array doch eh nicht verändert wird.

Hätte ich sonst irgendwo ein Object erwartet, würde das mit dem String doch weiterhin klappen.

Object o = t'[0] macht doch keine Probleme? Oder ist es wegen der initialisierung? Denn dort möchte ich das Array vielleicht mit Objects füllen und könnte dies nicht mit T' erreichen?
 

Neue Themen


Zurück
Oben