Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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.
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.
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){...}
Jetzt kommt etwas was ich in der Anwendung nicht verstehe.
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();
}
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?
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?