<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://ccwiki.digitalcampusvorarlberg.at/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sam</id>
	<title>CCWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://ccwiki.digitalcampusvorarlberg.at/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sam"/>
	<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php/Spezial:Beitr%C3%A4ge/Sam"/>
	<updated>2026-04-14T10:45:06Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Objektorientierte_Programmierung&amp;diff=1721</id>
		<title>Objektorientierte Programmierung</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Objektorientierte_Programmierung&amp;diff=1721"/>
		<updated>2021-02-26T11:05:58Z</updated>

		<summary type="html">&lt;p&gt;Sam: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;cite&amp;gt;Die objektorientierte Programmierung (kurz OOP) ist ein auf dem Konzept der Objektorientierung basierendes Programmierparadigma. Die Grundidee besteht darin, die Architektur einer Software an den Grundstrukturen desjenigen Bereichs der Wirklichkeit auszurichten, der die gegebene Anwendung betrifft. Ein Modell dieser Strukturen wird in der Entwurfsphase aufgestellt. Es enthält Informationen über die auftretenden Objekte und deren Abstraktionen, ihre Typen. Die Umsetzung dieser Denkweise erfordert die Einführung verschiedener Konzepte, insbesondere {{AL|Klasse|Klassen}}, {{AL|Vererbung}}, [[{{PAGENAMEE}}#Polymorphismus|Polymorphie]] und [[{{PAGENAMEE}}#Has_A|spätes Binden (dynamisches Binden)]].&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://de.wikipedia.org/wiki/{{PAGENAMEE}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
{{TOC limit|4}}&lt;br /&gt;
= Java =&lt;br /&gt;
Java ist eine objektorientierte Programmiersprache. In einigen Punkten nimmt Sie die &#039;&#039;&#039;Objektorientierung&#039;&#039;&#039; nicht so streng wie andere Sprachen. Ein Beispiel hierfür wären die {{Link|Primitive_Datentypen|primitiven Datentypen}}. Somit ist in Java nicht alles ein &#039;&#039;&#039;Objekt&#039;&#039;&#039; {{Link|Objekt.2FInstanz_VS._Klasse|(Was ist ein Objekt?)}} .&amp;lt;br&amp;gt;&lt;br /&gt;
== Primitive Datentypen ==&lt;br /&gt;
In Java gibt es eine vielzahl von &#039;&#039;&#039;primitiven Datentypen&#039;&#039;&#039;. Sie unterscheiden sich darin, dass Sie kein &#039;&#039;&#039;Objekt&#039;&#039;&#039; sind. Sie haben keine {{AL|Methoden}} und auch keine {{AL|Attribute}}. Wird eine Variable mit einem &#039;&#039;&#039;primitiven Datentyp&#039;&#039;&#039; erstellt und dieser Variable ein Wert zugewiesen, so enthält diese Variable den wirklichen &#039;&#039;&#039;Wert&#039;&#039;&#039; und nicht nur eine &#039;&#039;&#039;Referenz&#039;&#039;&#039; auf das eigentliche &#039;&#039;&#039;Objekt&#039;&#039;&#039;:&lt;br /&gt;
{{JML|code=//Variable a enthält den Wert 10&lt;br /&gt;
int a = 10;&lt;br /&gt;
//Variable b enthält nur den Verweis auf das Integer Objekt mit dem Wert 10&lt;br /&gt;
Integer b = Integer.valueOf(10);&lt;br /&gt;
}}&lt;br /&gt;
Zu jedem primitiven Datentyp gibt es eine entsprechende Klasse:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Entsprechende Klasse für primitive Datentypen&lt;br /&gt;
|-&lt;br /&gt;
! primitiver Datentyp !! Klasse/Komplexer Datentyp !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| {{JSL|int}} || {{JSL|java.lang.Integer}} || Ganzzahl in Zweierkomplent Darstellung, max: 2&amp;lt;sup&amp;gt;31&amp;lt;/sup&amp;gt;-1, min: -2&amp;lt;sup&amp;gt;31&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| {{JSL|long}} || {{JSL|java.lang.Long}} || Ganzzahl in Zweierkomplent Darstellung, max: 2&amp;lt;sup&amp;gt;63&amp;lt;/sup&amp;gt;-1, min: -2&amp;lt;sup&amp;gt;63&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| {{JSL|float}} || {{JSL|java.lang.Float}} || Fließkommazahl&lt;br /&gt;
|-&lt;br /&gt;
| {{JSL|double}} || {{JSL|java.lang.Double}} || Fließkommazahl mit doppelter Genauigkeit&lt;br /&gt;
|-&lt;br /&gt;
| {{JSL|char}} || {{JSL|java.lang.Character}} || Einzelnes Zeichen&lt;br /&gt;
|-&lt;br /&gt;
| {{JSL|boolean}} || {{JSL|java.lang.Boolean}} || Wahrheitswert, {{JSL|true}} oder {{JSL|false}}&lt;br /&gt;
|}&lt;br /&gt;
Primitive Datentypen können automatisch in ihr entsprechendes Klassenäquivalent (in ein &#039;&#039;&#039;Objekt&#039;&#039;&#039;) umgewandelt werden und natürlich umgekehrt. Dieser Prozess nennt sich &#039;&#039;&#039;Autoboxing&#039;&#039;&#039;. Dies ist vor allem von Vorteil, wenn mit &#039;&#039;&#039;Collections (Listen,...)&#039;&#039;&#039; gearbeitet wird, da diese nur mit &#039;&#039;&#039;Objekten&#039;&#039;&#039; funktionieren.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
//Umwandlung der Zahl 10 in ein Integer Object&lt;br /&gt;
Integer b = 10;&lt;br /&gt;
//Integer Object wird in primitive Zahl 10 umgewandelt&lt;br /&gt;
int c = b;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Klasse ==&lt;br /&gt;
&amp;lt;cite&amp;gt;Unter einer Klasse (auch Objekttyp genannt) versteht man in der objektorientierten Programmierung ein abstraktes Modell bzw. einen Bauplan für eine Reihe von ähnlichen Objekten. Die Klasse dient als Bauplan für die Abbildung von realen Objekten in Softwareobjekte und beschreibt Attribute (Eigenschaften) und Methoden (Verhaltensweisen) der Objekte. Verallgemeinernd könnte man auch sagen, dass eine Klasse dem Datentyp eines Objekts entspricht.&amp;lt;ref&amp;gt;https://de.wikipedia.org/wiki/Klasse_(Objektorientierung)&amp;lt;/ref&amp;gt;&amp;lt;/cite&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Wir sehen, eine &#039;&#039;&#039;Klasse&#039;&#039;&#039; kann man sich wie eine Vorlage vorstellen, aus dieser dann &#039;&#039;&#039;Instanzen&#039;&#039;&#039; bzw. &#039;&#039;&#039;Objekte&#039;&#039;&#039; mittels des Schlüsselworts {{JSL|new}} erstellt werden. Weiters sei erwähnt, dass jede &#039;&#039;&#039;Klasse&#039;&#039;&#039; egal ob es hingeschrieben wird oder nicht, von der Java &#039;&#039;&#039;Klasse&#039;&#039;&#039; {{JSL|java.lang.Object}} erbt.&lt;br /&gt;
=== Konstruktor ===&lt;br /&gt;
Jede &#039;&#039;&#039;Klasse&#039;&#039;&#039; hat einen Konstruktor, ist dieser leer, d.h. er nimmt keine Parameter, muss dieser nicht geschrieben werden. Der Konstruktor heißt immer gleich wie die &#039;&#039;&#039;Klasse&#039;&#039;&#039; selbst.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Animal {&lt;br /&gt;
  private String name;&lt;br /&gt;
&lt;br /&gt;
  //Standardkonstruktor wird verwendet.&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
//Instanz von Animal erstellen&lt;br /&gt;
Animal a = new Animal();&lt;br /&gt;
}}&lt;br /&gt;
Wollen wir nun beispielsweise garantieren, dass ein &#039;&#039;&#039;Animal&#039;&#039;&#039; bei der Instanzierung einen Namen hat, so könnten wir den &#039;&#039;&#039;Konstruktor&#039;&#039;&#039; verändern.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Animal {&lt;br /&gt;
  private String name;&lt;br /&gt;
&lt;br /&gt;
  public Animal(String name) {&lt;br /&gt;
    this.name = name;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
//Instanz von Animal erstellen&lt;br /&gt;
Animal a = new Animal(&amp;quot;Alfons&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
Es können auch mehrere &#039;&#039;&#039;Konstruktoren&#039;&#039;&#039; existieren. Diese können sich auch gegenseitig aufrufen. Sobald ein &#039;&#039;&#039;Konstruktor&#039;&#039;&#039; definiert wird, so kann der &#039;&#039;&#039;Standardkonstruktor&#039;&#039;&#039; nicht mehr zur Instanzierung verwendet werden. Soll der &#039;&#039;&#039;Standardkonstruktor&#039;&#039;&#039; weiter verfügbar sein, so muss dieser explizit hingeschrieben werden. Haben wir mehrere &#039;&#039;&#039;Konstruktoren&#039;&#039;&#039; so können wir auch von &#039;&#039;&#039;Konstruktor {{Link|Überladen_von_Methoden|Überladung}}&#039;&#039;&#039; sprechen.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Animal {&lt;br /&gt;
  private String name;&lt;br /&gt;
&lt;br /&gt;
  public Animal() {&lt;br /&gt;
    this(&amp;quot;John Doe&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public Animal(String name) {&lt;br /&gt;
    this.name = name;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
//Instanz von Animal erstellen&lt;br /&gt;
Animal a = new Animal(); //John Doe&lt;br /&gt;
//Weitere Instanz mit gewähltem Namen&lt;br /&gt;
Animal b = new Animal(&amp;quot;Alfons&amp;quot;); //Alfons&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
&#039;&#039;&#039;Klassen&#039;&#039;&#039; haben &#039;&#039;&#039;Attribute&#039;&#039;&#039; (Eigenschaften). Hier werden zwei Varianten von &#039;&#039;&#039;Attributen&#039;&#039;&#039; unterschieden. &#039;&#039;&#039;Instanzattribute&#039;&#039;&#039; und &#039;&#039;&#039;Klassenattribute&#039;&#039;&#039;.&lt;br /&gt;
==== Instanzattribut ====&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Animal {&lt;br /&gt;
  public String name;&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
//Korrekter Zugriff&lt;br /&gt;
Animal a = new Animal();&lt;br /&gt;
System.out.println(a.name);&lt;br /&gt;
}}&lt;br /&gt;
Jede &#039;&#039;&#039;Instanz&#039;&#039;&#039; einer &#039;&#039;&#039;Klasse&#039;&#039;&#039; verfügt über eigene &#039;&#039;&#039;Instanzattribute&#039;&#039;&#039;, diese werden nicht untereinander geteilt. Das heißt, gibt es mehrere &#039;&#039;&#039;Instanzen&#039;&#039;&#039; der selben &#039;&#039;&#039;Klasse&#039;&#039;&#039;, so haben die &#039;&#039;&#039;Instanzattribute&#039;&#039;&#039; unterschiedliche Werte.&lt;br /&gt;
&lt;br /&gt;
==== Klassenattribut ====&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Animal {&lt;br /&gt;
  public static double PI = 3.14;&lt;br /&gt;
}&lt;br /&gt;
//Korrekter Zugriff&lt;br /&gt;
System.out.println(Animal.PI);&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Attribute&#039;&#039;&#039; die mit dem Schlüsselwort &#039;&#039;&#039;static&#039;&#039;&#039; gekennzeichnet werden, existieren nur einmal. Vereinfacht gesagt, diese &#039;&#039;&#039;Attribute&#039;&#039;&#039; sind an die &#039;&#039;&#039;Klasse&#039;&#039;&#039; und nicht an die &#039;&#039;&#039;Instanz&#039;&#039;&#039; gebunden.&lt;br /&gt;
&lt;br /&gt;
=== Methoden === &lt;br /&gt;
&#039;&#039;&#039;Methoden&#039;&#039;&#039; sind Abläufe oder Verhaltensweisen die in &#039;&#039;&#039;Klassen&#039;&#039;&#039; definiert werden. Durch Methoden können &#039;&#039;&#039;Objekte&#039;&#039;&#039; miteinander interagieren, bzw. deren Zustand kann modifiziert werden. Genauso wie bei den &#039;&#039;&#039;Attributen&#039;&#039;&#039; können &#039;&#039;&#039;Methoden&#039;&#039;&#039; für eine &#039;&#039;&#039;Instanz&#039;&#039;&#039; mit dem Schlüsselwort {{JSL|static}} für die &#039;&#039;&#039;Klasse&#039;&#039;&#039; definiert werden.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Methoden&#039;&#039;&#039; haben zumindest:&lt;br /&gt;
* Methodennamen&lt;br /&gt;
* Rückgabetype&lt;br /&gt;
* 0 - * Übergabeparameter&lt;br /&gt;
* Methodenrumpf (Code der Ausgeführt wird)&lt;br /&gt;
&lt;br /&gt;
==== Methodensignatur ====&lt;br /&gt;
Die &#039;&#039;&#039;Methodensignatur&#039;&#039;&#039; einer Methode, besteht aus &#039;&#039;&#039;Methodenname&#039;&#039;&#039; und &#039;&#039;&#039;Übergabeparameter&#039;&#039;&#039;. Weiters muss die Signatur jeder &#039;&#039;&#039;Methode&#039;&#039;&#039; in der &#039;&#039;&#039;Klasse&#039;&#039;&#039; in der sie definiert wurde eindeutig sein.&amp;lt;br&amp;gt;&lt;br /&gt;
Warum gehört der &#039;&#039;&#039;Rückgabetyp&#039;&#039;&#039; nicht zur &#039;&#039;&#039;Methodensignatur&#039;&#039;&#039;? Dies soll anhand von folgendem Beispiel illustriert werden:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Calc {&lt;br /&gt;
  public int add(float a, float b) {&lt;br /&gt;
    return (int) (a + b);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public float add(float a, float b) {&lt;br /&gt;
    return a + b;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
In &#039;&#039;&#039;Java&#039;&#039;&#039; ist es nicht zwingend nötig den &#039;&#039;&#039;Rückgabewert&#039;&#039;&#039; einer &#039;&#039;&#039;Methode&#039;&#039;&#039; zu verarbeiten:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
  Calc c = new Calc();&lt;br /&gt;
  c.add(10.0f, 20.0f);&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Der &#039;&#039;&#039;Compiler&#039;&#039;&#039; hat keine Möglichkeit herauszufinden, welche &#039;&#039;&#039;Methode&#039;&#039;&#039; in {{JSL|Calc}} nun verwendet werden soll. Deswegen gehört der &#039;&#039;&#039;Rückgabetyp&#039;&#039;&#039; nicht zur &#039;&#039;&#039;Methodensignatur&#039;&#039;&#039; und das Beispiel würde nicht compilieren.&lt;br /&gt;
&lt;br /&gt;
==== Instanzmethode ====&lt;br /&gt;
Folgendes Beispiel zeigt den klassischen &#039;&#039;&#039;getter&#039;&#039;&#039; und &#039;&#039;&#039;setter&#039;&#039;&#039;, {{AL|Attribute}} sollten nach Möglichkeit nur über diese abgerufen und verändert werden und die {{AL|Attribute}} sollten nach außen hin nicht {{AL|Sichtbarkeit|sichtbar}} sein {{JSL|private}}. Warum? Durch den &#039;&#039;&#039;setter&#039;&#039;&#039; ist es möglich, eine inkorrekte Modifikation des &#039;&#039;&#039;Attributs&#039;&#039;&#039; zu unterbinden. Das heißt, es kann verhindert werden, dass ein {{AL|Attribute|Attribut}} auf einen Wert gesetzt wird, den es nicht annehmen sollte (z.B.: das Gewicht eines Tieres wird auf -10 gesetzt).&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Animal {&lt;br /&gt;
  private String name;&lt;br /&gt;
&lt;br /&gt;
  public void setName(String name) {&lt;br /&gt;
    this.name = name;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public String getName() {&lt;br /&gt;
    return this.name&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
//Korrekter Aufruf&lt;br /&gt;
Animal a = new Animal();&lt;br /&gt;
a.setName(&amp;quot;Alfons&amp;quot;);&lt;br /&gt;
System.out.println(a.getName());&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Klassenmethode ====&lt;br /&gt;
&#039;&#039;&#039;Klassenmethoden&#039;&#039;&#039; werden oft verwendet, um Operationen zu realisieren die nicht direkt mit nur einer &#039;&#039;&#039;Instanz&#039;&#039;&#039; zu tun haben. Oftmals werden &#039;&#039;&#039;Helper Methoden&#039;&#039;&#039; so realisiert. Diese &#039;&#039;&#039;Methoden&#039;&#039;&#039; werden direkt über die &#039;&#039;&#039;Klasse&#039;&#039;&#039; selbst aufgerufen, sie existieren nur einmal. Es ist möglich, aber die &#039;&#039;&#039;Methode&#039;&#039;&#039; soll nicht über eine &#039;&#039;&#039;Instanz&#039;&#039;&#039; der &#039;&#039;&#039;Klasse&#039;&#039;&#039; aufgerufen werden. Weiters sei angemerkt, das &#039;&#039;&#039;Klassenmethoden&#039;&#039;&#039; oder &#039;&#039;&#039;statische Methoden&#039;&#039;&#039; durch {{AL|Vererbung}} nicht &#039;&#039;&#039;überschrieben&#039;&#039;&#039; werden können.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Animal {&lt;br /&gt;
  private float weight;&lt;br /&gt;
&lt;br /&gt;
  public Animal(float weight) {&lt;br /&gt;
    this.weight = weight;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public static float calculateWeight(List&amp;lt;Animal&amp;gt; animals) {&lt;br /&gt;
    float weight = 0;&lt;br /&gt;
    for(Animal a : animal) {&lt;br /&gt;
      weight += a.weight;&lt;br /&gt;
    }&lt;br /&gt;
    return weight;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
//Korrekter Aufruf&lt;br /&gt;
List&amp;lt;Animal&amp;gt; animals = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
animals.add(new Animal(10));&lt;br /&gt;
animals.add(new Animal(20));&lt;br /&gt;
animals.add(new Animal(30));&lt;br /&gt;
System.out.println(Animal.calculateWeight(animals));&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Objekt/Instanz VS. Klasse ==&lt;br /&gt;
Jede {{AL|Klasse}} erbt von {{JSL|java.lang.Object}}. Somit ist jede {{AL|Klasse}} ein {{JSL|java.lang.Object}}. Wenn jedoch von einem &#039;&#039;&#039;Objekt&#039;&#039;&#039; gesprochen wird, so meint man meist die &#039;&#039;&#039;Instanz&#039;&#039;&#039; einer {{AL|Klasse}}.&lt;br /&gt;
&lt;br /&gt;
== Abstrakte Klasse ==&lt;br /&gt;
&#039;&#039;&#039;Abstrakte Klassen&#039;&#039;&#039; sind unfertige {{AL|Klasse|Klassen}}. Sie können nicht direkt &#039;&#039;&#039;instanziert&#039;&#039;&#039; werden. Es können nur &#039;&#039;&#039;Subklassen&#039;&#039;&#039; ({{AL|Klasse|Klassen}} die davon {{AL|Vererbung|erben}}) &#039;&#039;&#039;instanziert&#039;&#039;&#039; werden. Zusätzlich besteht die Möglichkeit eine &#039;&#039;&#039;Instanz&#039;&#039;&#039; durch eine &#039;&#039;&#039;Anonyme Implementierung&#039;&#039;&#039; der &#039;&#039;&#039;abstrakten Klasse&#039;&#039;&#039; zu erstellen.&lt;br /&gt;
&amp;lt;br&amp;gt;Sie einzusetzen ist sinnvoll, wenn sich eine Gruppe von {{AL|Klasse|Klassen}} Funktionalität teilt, doch gewisse Funktionalität von jeder einzelnen {{AL|Klasse}} implementiert werden muss.&amp;lt;br&amp;gt;&lt;br /&gt;
Die noch zu implementierenden &#039;&#039;&#039;Methoden&#039;&#039;&#039; und die {{AL|Klasse}} selbst werden mit dem Schlüsselwort {{JSL|abstract}} gekennzeichnet.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public abstract class Animal {&lt;br /&gt;
  private String name;&lt;br /&gt;
  private float weight;&lt;br /&gt;
&lt;br /&gt;
  public Animal(String name, String weight) {&lt;br /&gt;
    this.name = name;&lt;br /&gt;
    this.weight = weight;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  //Abstrakte Methode, muss implementiert werden&lt;br /&gt;
  public abstract void eat();&lt;br /&gt;
&lt;br /&gt;
  //Normale Methode&lt;br /&gt;
  public void sleep() {&lt;br /&gt;
    System.out.println(&amp;quot;My name is: &amp;quot; + name + &amp;quot; and i sleep!&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Cat extends Animal {&lt;br /&gt;
  public Animal(String name, String weight) {&lt;br /&gt;
    //Konstruktor der Superklasse muss aufgerufen werden&lt;br /&gt;
    super(name, weight);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @Override&lt;br /&gt;
  public void eat() {&lt;br /&gt;
    System.out.println(&amp;quot;I eat mice!&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Bird extends Animal {&lt;br /&gt;
  public Animal(String name, String weight) {&lt;br /&gt;
    //Konstruktor der Superklasse muss aufgerufen werden&lt;br /&gt;
    super(name, weight);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @Override&lt;br /&gt;
  public void eat() {&lt;br /&gt;
    System.out.println(&amp;quot;I eat worms!&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
//Instanzierung&lt;br /&gt;
Bird b = new Bird(&#039;Tweety&#039;);&lt;br /&gt;
b.eat();&lt;br /&gt;
//Folgendes ist auch möglich weil, durch die Vererbung, ein Bird ein Animal ist&lt;br /&gt;
Animal b1 = new Bird(&#039;Tweety&#039;);&lt;br /&gt;
b1.eat();&lt;br /&gt;
//Anonyme Implementierung&lt;br /&gt;
Animal a = new Animal(&amp;quot;Anonymous&amp;quot;, 30) {&lt;br /&gt;
  public void eat() {&lt;br /&gt;
    System.out.println(&amp;quot;I eat nothing.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Interface ==&lt;br /&gt;
&#039;&#039;&#039;Interfaces&#039;&#039;&#039; oder auch &#039;&#039;&#039;Schnittstellen&#039;&#039;&#039; bieten die Möglichkeit {{AL|Methoden}} zu definieren welche von {{AL|Klasse|Klassen}} die diese &#039;&#039;&#039;Schnittstelle&#039;&#039;&#039; implementieren, implementiert werden müssen. Eine {{AL|Klasse}} implementiert eine &#039;&#039;&#039;Schnittstelle&#039;&#039;&#039; mittels des Schlüsselworts {{JSL|implements}}, weiters müssen dann noch die {{AL|Methoden}} überschrieben bzw implementiert werden. Der Vorteil von &#039;&#039;&#039;Schnittstellen&#039;&#039;&#039; gegenüber der &#039;&#039;&#039;Vererbung&#039;&#039;&#039; ist, dass eine {{AL|Klasse}} mehrere &#039;&#039;&#039;Interfaces&#039;&#039;&#039; implementieren kann. Genauso wie bei der {{AL|Abstrakte_Klasse|abstrakten Klasse}} gilt, &#039;&#039;&#039;Interfaces&#039;&#039;&#039; können nicht direkt &#039;&#039;&#039;instanziert&#039;&#039;&#039; werden, eine &#039;&#039;&#039;anonyme Implementierung&#039;&#039;&#039; ist jedoch möglich. Ein &#039;&#039;&#039;Interface&#039;&#039;&#039; ist also eine Zusicherung dass eine {{AL|Klasse}} eine gewisse Funktionalität beherrscht.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public interface CanDrive {&lt;br /&gt;
  void drive();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public interface CanFly {&lt;br /&gt;
  void fly();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Car implements CanDrive {&lt;br /&gt;
  @Override&lt;br /&gt;
  public void drive() {&lt;br /&gt;
    System.out.println(&amp;quot;Driving on the road&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Plane implements CanFly {&lt;br /&gt;
  @Override&lt;br /&gt;
  public void fly() {&lt;br /&gt;
    System.out.println(&amp;quot;Flying in the sky&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class KnightRider implements CanDrive, CanFly {&lt;br /&gt;
  @Override&lt;br /&gt;
  public void drive() {&lt;br /&gt;
    System.out.println(&amp;quot;Driving on the road&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @Override&lt;br /&gt;
  public void fly() {&lt;br /&gt;
    System.out.println(&amp;quot;Flying in the sky&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
//Neues Flugzeug wird instanziert&lt;br /&gt;
Plane plane = new Plane();&lt;br /&gt;
//Zuweisung ist möglich, da die Klasse Plane CanFly implementiert&lt;br /&gt;
CanFly canFly = plane;&lt;br /&gt;
canFly.fly();&lt;br /&gt;
&lt;br /&gt;
//Neues Auto wird instanziert&lt;br /&gt;
Car car = new Car();&lt;br /&gt;
//Zuweisung ist möglich, da die Klasse Car CanDrive implementiert&lt;br /&gt;
CanDrive canDrive = car;&lt;br /&gt;
canDrive.drive();&lt;br /&gt;
&lt;br /&gt;
//Neuer KnightRider wird instanziert&lt;br /&gt;
KnightRider kitt = new KnightRider();&lt;br /&gt;
kitt.drive();&lt;br /&gt;
kitt.fly();&lt;br /&gt;
//Zuweisung ist möglich, da die Klasse KnightRider CanDrive implementiert&lt;br /&gt;
canDrive = kitt;&lt;br /&gt;
canDrive.drive();&lt;br /&gt;
//Nicht möglich obwohl Kitt fliegen kann, aber die Variable hat den Typ CanDrive, dieser kann nicht fliegen&lt;br /&gt;
//canDrive.fly();&lt;br /&gt;
//Zuweisung ist möglich, da die Klasse KnightRider CanFly implementiert&lt;br /&gt;
canFly = kitt;&lt;br /&gt;
canFly.fly();&lt;br /&gt;
//Nicht möglich obwohl Kit fahren kann, aber die Variable hat den Typ CanFly, dieser kann nicht fahren&lt;br /&gt;
//canFly.drive();&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Vererbung ==&lt;br /&gt;
Bei der &#039;&#039;&#039;Vererbung&#039;&#039;&#039; gibt es immer zwei Beteiligte, die &#039;&#039;&#039;Subklasse&#039;&#039;&#039; und die &#039;&#039;&#039;Superklasse&#039;&#039;&#039;. Die &#039;&#039;&#039;Subklasse&#039;&#039;&#039; erbt von der &#039;&#039;&#039;Superklasse&#039;&#039;&#039;. Das heißt Sie übernimmt alle {{AL|Attribute}} und alle {{AL|Methoden}}. Die &#039;&#039;&#039;Instanzmethoden&#039;&#039;&#039; können auch überschrieben werden, wenn diese nicht mit dem Schlüsselwort {{JSL|final}} markiert wurden. Vererbung geschieht mittels des Schlüsselworts {{JSL|extends}}, das heißt eine {{AL|Klasse}} erweitert eine andere {{AL|Klasse}}. In &#039;&#039;&#039;Java&#039;&#039;&#039; ist keine &#039;&#039;&#039;Mehrfachvererbung&#039;&#039;&#039; möglich. D.h. eine {{AL|Klasse}} kann nur von einer {{AL|Klasse}} erben.&lt;br /&gt;
 Die &#039;&#039;&#039;Superklasse&#039;&#039;&#039; kann entweder eine normale {{AL|Klasse}} oder eine {{AL|Abstrakte_Klasse|abstrakte Klasse}} sein. Von einem {{AL|Interface}} wird nicht geerbt, dieses wird &#039;&#039;&#039;implementiert&#039;&#039;&#039;.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Animal {&lt;br /&gt;
  private String name;&lt;br /&gt;
&lt;br /&gt;
  public Animal(String name) {&lt;br /&gt;
    this.name = name;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  //Kann nicht überschrieben werden&lt;br /&gt;
  public final String getName() {&lt;br /&gt;
    return this.name&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public void sayHello() {&lt;br /&gt;
    System.out.println(&amp;quot;Hallo, ich bin &amp;quot; + name);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Cat extends Animal {&lt;br /&gt;
  public Cat(String name) {&lt;br /&gt;
    //Der Konstruktor der Superklasse muss aufgerufen werden&lt;br /&gt;
    super(name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @Override&lt;br /&gt;
  public void sayHello() {&lt;br /&gt;
    System.out.println(&amp;quot;Hallo mein Name ist &amp;quot; + getName() + &amp;quot; und ich bin eine Katze!&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Dog extends Animal {&lt;br /&gt;
  public Dog(String name) {&lt;br /&gt;
    //Der Konstruktor der Superklasse muss aufgerufen werden&lt;br /&gt;
    super(name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @Override&lt;br /&gt;
  public void sayHello() {&lt;br /&gt;
    System.out.println(&amp;quot;Hallo mein Name ist &amp;quot; + getName() + &amp;quot; und ich bin eine Dog!&amp;quot;);&lt;br /&gt;
    //Aufruf der Methode in der Superklasse.&lt;br /&gt;
    super.sayHello();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Folgendes ist wichtig bei der Vererbung zu erwähnen. Die &#039;&#039;&#039;Subklasse&#039;&#039;&#039; muss den &#039;&#039;&#039;Konstruktor&#039;&#039;&#039; der &#039;&#039;&#039;Superklasse&#039;&#039;&#039; aufrufen, dies geschieht mittels {{JSL|super(...)}}. Wenn es nur den &#039;&#039;&#039;Standardkonstruktor&#039;&#039;&#039; (keine Parameter) gibt, muss {{JSL|super()}} nicht aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
== Package ==&lt;br /&gt;
{{AL|Klasse|Klassen}} und {{AL|Interface|Interfaces}} sind in &#039;&#039;&#039;Java&#039;&#039;&#039; immer in &#039;&#039;&#039;Packages&#039;&#039;&#039; unterteilt. Diese dienen zum Gruppieren nach verschiedenen Zugehörigkeiten. Die &#039;&#039;&#039;Package&#039;&#039;&#039; Definition befindet sich immer bei der {{AL|Klasse}} oder dem {{AL|Interface}} ganz oben. Die Dateien werden intern in Ordnern abgelegt.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
package at.drlue.matura;&lt;br /&gt;
&lt;br /&gt;
public class Matura {&lt;br /&gt;
  public void printNote() {&lt;br /&gt;
    System.out.println(&amp;quot;Eins&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Die {{AL|Klasse}} {{JSL|Matura}} befindet sich in der Datei &#039;&#039;&#039;Matura.java&#039;&#039;&#039;, diese Datei befindet sich im Ordner &#039;&#039;&#039;at/drlue/matura/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Sichtbarkeit ==&lt;br /&gt;
Die Sichtbarkeit einer [[{{PAGENAMEE}}#Klasse|Klasse]], [[{{PAGENAMEE}}#Methode|Methode]] oder eines [[{{PAGENAMEE}}#Attribute|Attributs]] kann über Schlüsselwörter verändert werden. Diese beschreiben von wo aus der Zugriff darauf erfolgen darf. Die Folgende Tabelle zeigt diese Schlüsselwörter und von wo aus der Zugriff erfolgen kann:&lt;br /&gt;
[[Datei:Sichtbarkeit.png|mini|ohne|400px|Sichtbarkeit&amp;lt;ref&amp;gt;https://wuselsnej.wordpress.com/coding/android/android-sichtbarkeit-java/&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Datei: at/drlue/matura/packageA/A.java&#039;&#039;&#039;&lt;br /&gt;
{{JML|code=public class A {&lt;br /&gt;
  public String hi() {&lt;br /&gt;
    System.out.println(&amp;quot;Hallo&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  private String bye() {&lt;br /&gt;
    System.out.println(&amp;quot;Bye&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  protected String what() {&lt;br /&gt;
    System.out.println(&amp;quot;Was geht?&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  //Ohne Sichtbarkeitsmodifier ist es Default&lt;br /&gt;
  String howDoYouDo() {&lt;br /&gt;
    System.out.println(&amp;quot;Wie geht es dir?&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Datei: at/drlue/matura/packageB/B.java&#039;&#039;&#039;&lt;br /&gt;
{{JML|code=public class B {&lt;br /&gt;
  private A a = new A();&lt;br /&gt;
&lt;br /&gt;
  public String hiAccess() {&lt;br /&gt;
    a.hi();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public String byeAccess() {&lt;br /&gt;
    //Nicht möglich da Zugriff private&lt;br /&gt;
    //a.bye();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public String whatAccess() {&lt;br /&gt;
    //Zugriff möglich, da nicht im selben Package&lt;br /&gt;
    a.what();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public String howDoYouDoAccess() {&lt;br /&gt;
    //Zugriff nicht möglich, da nicht im selben Package&lt;br /&gt;
    a.howDoYouDo();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Datei: at/drlue/matura/packageA/C.java&#039;&#039;&#039;&lt;br /&gt;
{{JML|code=public class C {&lt;br /&gt;
  private A a = new A();&lt;br /&gt;
&lt;br /&gt;
  public String hiAccess() {&lt;br /&gt;
    a.hi();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public String byeAccess() {&lt;br /&gt;
    //Nicht möglich da Zugriff private&lt;br /&gt;
    //a.bye();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public String whatAccess() {&lt;br /&gt;
    //Zugriff möglich, da selbes Package&lt;br /&gt;
    a.what();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public String howDoYouDoAccess() {&lt;br /&gt;
    //Zugriff möglich, da selbes Package&lt;br /&gt;
    a.howDoYouDo();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Datei: at/drlue/matura/packageD/D.java&#039;&#039;&#039;&lt;br /&gt;
{{JML|code=public class D extends A {&lt;br /&gt;
  private A a = new A();&lt;br /&gt;
&lt;br /&gt;
  public String hiAccess() {&lt;br /&gt;
    a.hi();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public String byeAccess() {&lt;br /&gt;
    //Nicht möglich da Zugriff private&lt;br /&gt;
    //a.bye();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public String whatAccess() {&lt;br /&gt;
    //Zugriff möglich, da geerbt wird&lt;br /&gt;
    a.what();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public String howDoYouDoAccess() {&lt;br /&gt;
    //Zugriff nicht möglich, da nicht im selben Package obwohl geerbt wird&lt;br /&gt;
    a.howDoYouDo();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
== Casten ==&lt;br /&gt;
Mittels &#039;&#039;&#039;Casting&#039;&#039;&#039; können untereinander &#039;&#039;&#039;kompatible Datentypen&#039;&#039;&#039; umgewandelt werden.&lt;br /&gt;
=== Casten von primitiven Datentypen ===&lt;br /&gt;
{{Link|Primitive_Datentypen|Primitive Datentypen}} enthalten, werden Sie einer Variable zugewiesen, wirklich den Wert den Sie repräsentieren. Ein &#039;&#039;&#039;casten&#039;&#039;&#039; führt wirklich zu einem neuen Wert (verändert aber nicht den alten). Alle {{Link|Primitive_Datentypen|primitiven Datentypen}} können untereinander umgewandelt werden, außer {{JSL|boolean}}.&lt;br /&gt;
{{JML|code=long a = 10;&lt;br /&gt;
//long wird in int umgewandelt&lt;br /&gt;
int b = (int)a;&lt;br /&gt;
//einem long kann aber ohne Casting ein int zugewiesen werden&lt;br /&gt;
a = b;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Casten von Objekten ===&lt;br /&gt;
&#039;&#039;&#039;Objekte&#039;&#039;&#039; können nur in den Datentyp anderer kompatibler {{AL|Klasse|Klassen}} &#039;&#039;&#039;gecastet&#039;&#039;&#039; werden. Vereinfacht gesagt, es muss möglich sein, dass der &#039;&#039;&#039;Cast&#039;&#039;&#039; erfolgreich ist. Weiters ist hier zu erwähnen, dass keine Umwandlung der Daten erfolgt. Wird ein &#039;&#039;&#039;Objekt&#039;&#039;&#039; einer Variable zugewiesen, so ist dies &#039;&#039;&#039;nicht&#039;&#039;&#039; der Wert selbst, sondern nur eine &#039;&#039;&#039;Referenz&#039;&#039;&#039; darauf. Mit dem &#039;&#039;&#039;Cast&#039;&#039;&#039; wird nur das erwartete geändert, dass sich an der Stelle befindet, an die diese Referenz zeigt.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class A {}&lt;br /&gt;
&lt;br /&gt;
public class B {}&lt;br /&gt;
...&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
  A a = new A();&lt;br /&gt;
  //Zuweisung nicht möglich, da A niemals ein B sein kann&lt;br /&gt;
  //B b = (B)a;&lt;br /&gt;
&lt;br /&gt;
  //Jede Klasse erbt von java.lang.Object kein Cast ist erforderlich da A ein Object ist&lt;br /&gt;
  Object obj = a;&lt;br /&gt;
  //Dieser Cast ist möglich, wir wissen zwar dass dies zu einer ClassCastException führt&lt;br /&gt;
  B b = (B) obj;&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Exceptions ==&lt;br /&gt;
&#039;&#039;&#039;Exceptions&#039;&#039;&#039; oder &#039;&#039;&#039;Ausnahmen&#039;&#039;&#039; können von {{AL|Methoden}} und auch von {{Link|Konstruktor|Konstruktoren}} geworfen werden. Eine &#039;&#039;&#039;Exception&#039;&#039;&#039; tritt auf, wenn eine {{AL|Methoden}} außerhalb ihrer gewünschten Funktionalität operiert. Jede &#039;&#039;&#039;Exception&#039;&#039;&#039; ist ein {{JSL|java.lang.Throwable}}, d.h. Sie kann mittels des Schlüsselworts {{JSL|throw}} geworfen werden. Weiters unterscheiden wir zwei Arten von &#039;&#039;&#039;Exceptions&#039;&#039;&#039;.&lt;br /&gt;
=== Checked Exceptions ===&lt;br /&gt;
Dazu gehört jede &#039;&#039;&#039;Exception&#039;&#039;&#039; die von {{JSL|java.lang.Throwable}} erbt, aber keine {{JSL|java.lang.RuntimeException}} und kein {{JSL|java.lang.Error}} ist. Wenn &#039;&#039;&#039;Checked Exceptions&#039;&#039;&#039; geworfen werden, so muss dies in der {{AL|Methoden|Methode}} mittels {{JSL|throws ExceptionName}} deklariert werden. Zusätzlich muss die geworfene &#039;&#039;&#039;Exception&#039;&#039;&#039; auch immer von der Aufrufenden {{AL|Methoden|Methode}} behandelt, oder weitergeworfen, werden.&lt;br /&gt;
&lt;br /&gt;
=== Unchecked Exceptions ===&lt;br /&gt;
Dazu gehören Alle &#039;&#039;&#039;Exceptions&#039;&#039;&#039; welche von {{JSL|java.lang.Error}} oder von {{JSL|java.lang.RuntimeException}} erben. Diese &#039;&#039;&#039;Exceptions&#039;&#039;&#039; müssen nicht in der {{Link|Methoden}} Definition deklariert werden. Sie können abgefangen und behandelt werden, normalerweise sollten diese aber überhaupt nicht auftreten.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Beispiele für RuntimeExceptions&lt;br /&gt;
|-&lt;br /&gt;
! Klasse !! Code&lt;br /&gt;
|-&lt;br /&gt;
| {{JSL|java.lang.IndexOutOfBoundsException}} ||&lt;br /&gt;
{{JML|code=&lt;br /&gt;
int[] arr = new int[]{1,2,3,4};&lt;br /&gt;
//Index existiert nicht&lt;br /&gt;
System.out.println(arr[5]);&lt;br /&gt;
}}&lt;br /&gt;
|-&lt;br /&gt;
| {{JSL|java.lang.NullPointerException}} ||&lt;br /&gt;
{{JML|code=&lt;br /&gt;
Animal a = null;&lt;br /&gt;
//Die Referenz ist null, beim Zugriff crashts&lt;br /&gt;
System.out.println(a.toString());&lt;br /&gt;
}}&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Beispiele für Errors&lt;br /&gt;
|-&lt;br /&gt;
! Klasse !! Code&lt;br /&gt;
|-&lt;br /&gt;
| {{JSL|java.lang.OutOfMemoryError}} ||&lt;br /&gt;
{{JML|code=&lt;br /&gt;
//Tritt auf wenn keine weiteren neuen Objekte mehr erstellt werden können&lt;br /&gt;
List&amp;lt;int[]&amp;gt; list = new LinkedList&amp;lt;&amp;gt;();&lt;br /&gt;
while(true) {&lt;br /&gt;
  list.add(new int[10000]);&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Exceptions selbst definieren ===&lt;br /&gt;
Natürlich können auch eigene &#039;&#039;&#039;Exceptions&#039;&#039;&#039; erstellt werden. Sinnvoll ist dies, wenn die eigene &#039;&#039;&#039;Exception&#039;&#039;&#039; einen Mehrwert an Information liefert.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class HttpStatusCodeException extends Exception {&lt;br /&gt;
  private int statusCode;&lt;br /&gt;
  private String url;&lt;br /&gt;
&lt;br /&gt;
  public HttpStatusCodeException(int statusCode, String url) {&lt;br /&gt;
    //Text für die Exception wird erstellt&lt;br /&gt;
    super(&amp;quot;Beim Aufruf von &amp;quot;+url+&amp;quot; ist ein Fehler mit dem Statuscode [&amp;quot;+statusCode+&amp;quot;] aufgetreten&amp;quot;);&lt;br /&gt;
    this.statusCode = statusCode;&lt;br /&gt;
    this.url = url;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public int getStatusCode() {&lt;br /&gt;
    return statusCode;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public String getUrl() {&lt;br /&gt;
    return this.url;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
  try {&lt;br /&gt;
    executeRequest(&amp;quot;https://drlue.at&amp;quot;);&lt;br /&gt;
  } catch(HttpsStatusCodeException exc) {&lt;br /&gt;
    if(exc.getStatusCode() == 401) {&lt;br /&gt;
      login();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private static void executeRequest(String url) throws HttpStatusCodeException {&lt;br /&gt;
     Response resp = ...//network request&lt;br /&gt;
     if(!resp.isSuccessfull()) {&lt;br /&gt;
        throw new HttpStatusCodeException(resp.statusCode(), url);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
Im folgenden Beispiel wird eine {{Link|Methoden|Methode}} erstellt, welche einen Dateinamen nimmt und die Länge der Datei zurückgibt. Existiert die Datei nicht, so wird eine {{JSL|java.lang.FileNotFoundException}} geworfen:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public static long getFileLength(String fileName) throws FileNotFoundException {&lt;br /&gt;
  File f = new File(fileName);&lt;br /&gt;
  if(!f.exists()) {&lt;br /&gt;
    throw new FileNotFoundException();&lt;br /&gt;
  }&lt;br /&gt;
  return f.length();&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Die {{Link|Methoden|Methode}} können wir folgendermaßen verwenden, bei dieser Variante fangen wir die &#039;&#039;&#039;Exception&#039;&#039;&#039; ab:&lt;br /&gt;
{{JML|highlight=&#039;2,5-7&#039;|code=&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
  try {&lt;br /&gt;
    long length = getFileLength(&amp;quot;wichtig.txt&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot;Die Datei ist: &amp;quot;+length+&amp;quot;Bytes lang&amp;quot;);&lt;br /&gt;
  } catch(FileNotFoundException exc) {&lt;br /&gt;
    System.out.println(&amp;quot;Die Datei wurde nicht gefunden!&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Eine weitere Variante ist, dass die Aufrufende {{Link|Methoden|Methode}}, die &#039;&#039;&#039;Exception&#039;&#039;&#039; weiter wirft.&lt;br /&gt;
{{JML|highlight=&#039;1&#039;|code=&lt;br /&gt;
public static void main(String[] args) throws FileNotFoundException {&lt;br /&gt;
  long length = getFileLength(&amp;quot;wichtig.txt&amp;quot;);&lt;br /&gt;
  System.out.println(&amp;quot;Die Datei ist: &amp;quot;+length+&amp;quot;Bytes lang&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Es kann auch zuerst die &#039;&#039;&#039;Exception&#039;&#039;&#039; gefangen, und dann weitergeworfen werden.&lt;br /&gt;
Eine weitere Variante ist, dass die Aufrufende {{Link|Methoden|Methode}}, die &#039;&#039;&#039;Exception&#039;&#039;&#039; weiter wirft.&lt;br /&gt;
{{JML|highlight=&#039;2,5-8&#039;|code=&lt;br /&gt;
public static void main(String[] args) throws FileNotFoundException {&lt;br /&gt;
  try {&lt;br /&gt;
    long length = getFileLength(&amp;quot;wichtig.txt&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot;Die Datei ist: &amp;quot;+length+&amp;quot;Bytes lang&amp;quot;);&lt;br /&gt;
  } catch(FileNotFoundException exc) {&lt;br /&gt;
    System.out.println(&amp;quot;Die Datei wurde nicht gefunden!&amp;quot;);&lt;br /&gt;
    throw exc;&lt;br /&gt;
  }&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Weitere wichtige Dinge ==&lt;br /&gt;
Hier sollen noch einige weitere Dinge abgeklärt werden.&lt;br /&gt;
=== Überladen von Methoden ===&lt;br /&gt;
Wir sprechen von &#039;&#039;&#039;überladen&#039;&#039;&#039; einer {{AL|Methoden|Methode}}, wenn mehrere {{AL|Methoden}} in einer {{AL|Klasse}} existieren die den selben Namen haben, sich aber die &#039;&#039;&#039;Übergabeparameter&#039;&#039;&#039;, entweder in ihrem Datentyp, oder der Anzahl unterscheiden. Ein {{Link|Konstruktor}} kann ebenfalls überladen werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Im folgenden Beispiel wird die {{AL|Methoden|Methode}} {{JSL|add(...)}} überladen. Der &#039;&#039;&#039;Compiler&#039;&#039;&#039; entscheidet anhand des Datentyps der Parameter welche {{AL|Methoden|Methode}} verwendet werden soll, &#039;&#039;&#039;der Rückgabetyp spielt keine Rolle.&#039;&#039;&#039;&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Calc {&lt;br /&gt;
  public int add(int a, int b) {&lt;br /&gt;
    return a + b;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public float add(float a, float b) {&lt;br /&gt;
    return a + b;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
  Calc c = new Calc();&lt;br /&gt;
  //Die add Methode mit den floats wird verwendet, weil die Parameter floats sind&lt;br /&gt;
  float a = c.add(3.0f, 2.0f);&lt;br /&gt;
  //Die add Methode mit den ints wird verwendet, weil die Parameter ints sind&lt;br /&gt;
  float a = c.add(3, 2); &lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Polymorphismus ===&lt;br /&gt;
&#039;&#039;&#039;Polymorphismus&#039;&#039;&#039; oder &#039;&#039;&#039;Vielgestaltigkeit&#039;&#039;&#039; beschreibt den Sachverhalt, wenn ein &#039;&#039;&#039;Objekt&#039;&#039;&#039; des Typs {{JSL|A}} vorhanden ist, in Wirklichkeit ein {{JSL|B}} sein kann (natürlich nur wenn {{JSL|B}} von {{JSL|A}} {{Link|Vererbung|erbt}} bzw. {{JSL|A}} &#039;&#039;&#039;implementiert&#039;&#039;&#039;, ansonsten kann das nicht sein). Die &#039;&#039;&#039;Vielgestaltigkeit&#039;&#039;&#039; bezieht sich somit auf das Aufrufen von {{AL|Methoden}}. Wird eine Methode von {{JSL|A}} aufgerufen, so kann dies in Wirklichkeit die {{AL|Methoden|Methode}} in {{JSL|B}} aufrufen, wenn {{JSL|B}} diese überschreibt. Eine Methode ist &#039;&#039;&#039;Polymorph&#039;&#039;&#039; wenn diese in der &#039;&#039;&#039;Subklasse&#039;&#039;&#039; die selbe {{Link|Methodensignatur}} aufweist wie in der &#039;&#039;&#039;Superklasse&#039;&#039;&#039;.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class A {&lt;br /&gt;
  public void doSomething() {&lt;br /&gt;
    System.out.println(&amp;quot;My name is A and I do something!&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class B extends A {&lt;br /&gt;
  @Override&lt;br /&gt;
  public void doSomething() {&lt;br /&gt;
    System.out.println(&amp;quot;My name is B and I do something!&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
  reallyDoSomething(new B());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public static void reallyDoSomething(A a) {&lt;br /&gt;
  a.doSomething();&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Obwohl in der Methode {{JSL|reallyDoSomething(A a)}} eine &#039;&#039;&#039;Instanz&#039;&#039;&#039; von {{JSL|A}} als Parameter erwartet wird, ist es in Wirklichkeit eine &#039;&#039;&#039;Instanz&#039;&#039;&#039; von {{JSL|B}}. Ein Aufruf von  {{JSL|a.doSomething()}} führt nicht den Code in {{JSL|A}} sondern den Code in {{JSL|B}} aus, da {{JSL|doSomething()}} in {{JSL|B}} überschrieben wurde.&lt;br /&gt;
&lt;br /&gt;
=== Beziehungen ===&lt;br /&gt;
Hier sollen noch die Beziehungen zwischen [[{{PAGENAMEE}}#Klasse|Klassen]] bzw. &#039;&#039;&#039;Objekten&#039;&#039;&#039; geklärt werden.&lt;br /&gt;
==== Is A ====&lt;br /&gt;
Wenn eine {{AL|Klasse}} {{JSL|Cat}} eine {{AL|Klasse}} {{JSL|Animal}} erweitert, d.h. von ihr {{Link|Vererbung|erbt}}. Somit &#039;&#039;&#039;ist&#039;&#039;&#039; {{JSL|Cat}} ein {{JSL|Animal}} und die folgende Zuweisung ist möglich:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
Cat cat = new Cat();&lt;br /&gt;
Animal animal = cat;&lt;br /&gt;
}}&lt;br /&gt;
Umgekehrt ist das nicht zwingend so. Wenn ein &#039;&#039;&#039;Objekt&#039;&#039;&#039; vom Typ {{JSL|Animal}} vorhanden ist, so könnte es ein &#039;&#039;&#039;Objekt&#039;&#039;&#039; vom Typ {{JSL|Cat}} sein, muss es aber nicht. Um dies zu prüfen gibt es das Schlüsselwort {{JSL|instanceof}} und es kann ein {{Link|Casten|Cast}} erfolgen. Die Umwandlung ist auch ohne Prüfung möglich, dies kann jedoch zu Abstürzen durch eine {{JSL|java.lang.ClassCastException}} führen.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public void doSomething(Animal animal) {&lt;br /&gt;
  if(animal instanceof Cat) {&lt;br /&gt;
    Cat cat = (Cat) animal;&lt;br /&gt;
    cat.miau();&lt;br /&gt;
  } else {&lt;br /&gt;
    System.out.println(&amp;quot;Can&#039;t miau&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Das selbe gilt genau gleich, wenn eine {{AL|Klasse}} ein {{AL|Interface}} implementiert.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Is A&#039;&#039;&#039; ist somit eine Erweiterung einer {{AL|Klasse}}, oder eine Implementierung einer {{AL|Interface|Schnittstelle}}.&lt;br /&gt;
 Es handelt sich hierbei um eine &#039;&#039;&#039;starke Bindung&#039;&#039;&#039;, d.h. diese kann zur Laufzeit des Programmes &#039;&#039;&#039;nicht&#039;&#039;&#039; verändert werden.&lt;br /&gt;
&lt;br /&gt;
==== Has A ====&lt;br /&gt;
Eine &#039;&#039;&#039;Has A&#039;&#039;&#039; Beziehung wird auch &#039;&#039;&#039;Komposition&#039;&#039;&#039; oder &#039;&#039;&#039;Zusammenstellung&#039;&#039;&#039; genannt. &#039;&#039;&#039;Komposition&#039;&#039;&#039; ist eine &#039;&#039;&#039;schwache Bindung&#039;&#039;&#039;. Sie kann während der Laufzeit des Programmes verändert werden. Folgendes Beispiel soll eine &#039;&#039;&#039;Has A&#039;&#039;&#039; Beziehung verdeutlichen:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public class Cat {&lt;br /&gt;
  private List&amp;lt;Spielzeug&amp;gt; spielzeuge = new ArrayList();&lt;br /&gt;
&lt;br /&gt;
  public void addSpielzeug(Spielzeug spielzeug) {&lt;br /&gt;
    this.spielzeuge.add(spielzeug);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public void removeSpielzeug(Spielzeug spielzeug) {&lt;br /&gt;
    this.spielzeuge.remove(spielzeug);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Spielzeug {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
  Cat cat = new Cat();&lt;br /&gt;
&lt;br /&gt;
  Spielzeug ball = new Spielzeug();&lt;br /&gt;
&lt;br /&gt;
  cat.addSpielzeug(ball);&lt;br /&gt;
  &lt;br /&gt;
  cat.removeSpielzeug(ball);&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Hier wird gezeigt, dass &#039;&#039;&#039;Objekten&#039;&#039;&#039; zur Laufzeit andere &#039;&#039;&#039;Objekte&#039;&#039;&#039; hinzugefügt und entfernt werden können.&lt;br /&gt;
 &#039;&#039;&#039;Has A&#039;&#039;&#039; Beziehung ist eine schwache Bindung.&lt;br /&gt;
&lt;br /&gt;
== Multithreading ==&lt;br /&gt;
&#039;&#039;&#039;Threading&#039;&#039;&#039; oder &#039;&#039;&#039;Nebenläufigkeit&#039;&#039;&#039; bezeichnet den Vorgang in einem Programm das unterschiedliche Handlungsstränge aufweist. D.h. verschiedene Programmabläufe laufen parallel. Diese Parallelität kann wirklich parallel ablaufen, d.h. 2 oder mehr &#039;&#039;&#039;CPUs&#039;&#039;&#039; sind involviert, oder es kann pseudo parallel Ablaufen, zwischen den unterschiedlichen Abläufen wird sehr schnell hin und her gewechselt, aber alles läuft auf einer &#039;&#039;&#039;CPU&#039;&#039;&#039;. Je nach Implementierung der &#039;&#039;&#039;J&#039;&#039;&#039;ava &#039;&#039;&#039;V&#039;&#039;&#039;irtual &#039;&#039;&#039;M&#039;&#039;&#039;achine läuft es wirklich parallel oder nur pseudo parallel (&#039;&#039;&#039;green Threads&#039;&#039;&#039;).  Folgendes Beispiel soll einen parallelen Ablauf verdeutlichen:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
  Thread a = new Thread(new Runnable() {&lt;br /&gt;
    public void run() {&lt;br /&gt;
      for(int i=0; i&amp;lt;10; i++) {&lt;br /&gt;
        System.out.println(&amp;quot;Hallo von Thread A: &amp;quot;+i);&lt;br /&gt;
        try {&lt;br /&gt;
          Thread.sleep(100);&lt;br /&gt;
        } catch(InterruptedException exc) { }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  Thread b = new Thread(new Runnable() {&lt;br /&gt;
    public void run() {&lt;br /&gt;
      for(int i=0; i&amp;lt;10; i++) {&lt;br /&gt;
        System.out.println(&amp;quot;Hallo von Thread B: &amp;quot;+i);&lt;br /&gt;
        try {&lt;br /&gt;
          Thread.sleep(100);&lt;br /&gt;
        } catch(InterruptedException exc) { }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  a.start();&lt;br /&gt;
  b.start();&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Zuerst werden die &#039;&#039;&#039;Threads&#039;&#039;&#039; erstellt, diesen wird ein &#039;&#039;&#039;Objekt&#039;&#039;&#039; des Typs {{JSL|java.lang.Runnable}} mitgegeben. Alternativ kann auch eine {{AL|Klasse}} erstellt werden, welche von {{JSL|java.lang.Thread}} erbt und die {{JSL|run()}} {{AL|Methoden|Methode}} überschreibt. Nach dem initialisieren, können die {{JSL|Thread}} &#039;&#039;&#039;Instanzen&#039;&#039;&#039; mittels {{JSL|start()}} gestartet werden, {{JSL|run()}} wird nun jeweils in einem anderen &#039;&#039;&#039;Thread&#039;&#039;&#039; aufgerufen, der Ablauf ist dadurch &#039;&#039;parallel&#039;&#039;, also &#039;&#039;gleichzeitig&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Synchronisierung ===&lt;br /&gt;
Verwendet ein Programm mehrere &#039;&#039;&#039;Threads&#039;&#039;&#039; so kann dies zu Problemen führen, wenn &#039;&#039;&#039;kritische Bereiche&#039;&#039;&#039;, welche &#039;&#039;&#039;nicht atomare Operationen&#039;&#039;&#039; enthalten gleichzeitig verwendet werden.&lt;br /&gt;
 Atomare Operationen sind nicht Teilbar. Eine int Variable zu erhöhen ist Teilbar.&amp;lt;br&amp;gt;&lt;br /&gt;
 1) Nimm die Zahl und erhöhe sie um 1&lt;br /&gt;
 2) Überschreibe den Speicherbereich der Zahl&lt;br /&gt;
{{JML|code=&lt;br /&gt;
private static int count = 0;&lt;br /&gt;
&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
  Thread a = new Thread(new Runnable() {&lt;br /&gt;
    public void run() {&lt;br /&gt;
      for(int i=0; i&amp;lt;1000; i++) {&lt;br /&gt;
        count++;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  Thread b = new Thread(new Runnable() {&lt;br /&gt;
    public void run() {&lt;br /&gt;
      for(int i=0; i&amp;lt;1000; i++) {&lt;br /&gt;
        count++;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  a.start();&lt;br /&gt;
  b.start();&lt;br /&gt;
  &lt;br /&gt;
  //Warten bis die Threads beendet wurden&lt;br /&gt;
  try {&lt;br /&gt;
    a.join();&lt;br /&gt;
  } catch(InterruptedException exc) {}&lt;br /&gt;
  try {&lt;br /&gt;
    b.join();&lt;br /&gt;
  } catch(InterruptedException exc) {}&lt;br /&gt;
  System.out.println(&amp;quot;Increments: &amp;quot;+(2000));&lt;br /&gt;
  System.out.println(&amp;quot;Actual count: &amp;quot;+count);&lt;br /&gt;
  System.out.println(&amp;quot;Difference: &amp;quot;+(2000 - count));&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
In diesem Beispiel ist ersichtlich, dass die Variable am Ende nicht &#039;&#039;2000&#039;&#039; ist, aufgrund dieser &#039;&#039;&#039;nicht atomaren&#039;&#039;&#039; Erhöhung der Zahl um 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Um &#039;&#039;&#039;nicht atomare Bereiche&#039;&#039;&#039; sicher zu machen, kann das Schlüsselwort {{JSL|synchronized}} verwendet werden. {{JSL|synchronized}} verwendet ein sogenanntes &#039;&#039;&#039;Object Lock&#039;&#039;&#039; um einen kritischen Bereich abzusichern. Beim Betreten wird dieses geholt, beim Verlassen zurückgegeben. Dieses &#039;&#039;&#039;Lock&#039;&#039;&#039; existiert bei jedem &#039;&#039;&#039;Objekt&#039;&#039;&#039; nur einmal. Kann es nicht geholt werden, so wird gewartet bis es verfügbar ist und erst dann wird der geschützte Bereich betreten.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Wie kann {{JSL|synchronized}} verwendet werden&lt;br /&gt;
|-&lt;br /&gt;
! Code !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{{JML|code=&lt;br /&gt;
synchronized(object) {&lt;br /&gt;
  //kritischer Bereich&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
|| Das &#039;&#039;&#039;Lock&#039;&#039;&#039; wird von einem bestimmten &#039;&#039;&#039;Object&#039;&#039;&#039; geholt.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public synchronized void doSomething() {&lt;br /&gt;
  //kritischer Bereich&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
|| Das &#039;&#039;&#039;Lock&#039;&#039;&#039; wird von der &#039;&#039;&#039;Instanz&#039;&#039;&#039; geholt, zu der dieser &#039;&#039;&#039;Methodenaufruf&#039;&#039;&#039; gehört.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{{JML|code=&lt;br /&gt;
public static synchronized void doSomething() {&lt;br /&gt;
  //kritischer Bereich&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
{{Space30}}{{Space30}}{{Space30}}{{Space30}}&lt;br /&gt;
|| Synchronized kann auch bei &#039;&#039;&#039;statischen Methoden&#039;&#039;&#039; verwendet werden. Das &#039;&#039;&#039;Lock&#039;&#039;&#039; wird von der {{AL|Klasse}} selbst geholt. Die geladene {{AL|Klasse}} ist ebenfalls eine Instanz (von der eigenen Definition), diese existiert aber nur einmal.&lt;br /&gt;
|}&lt;br /&gt;
Somit kann das oben genannte Beispiel gelöst werden:&lt;br /&gt;
{{JML|code=&lt;br /&gt;
private static int count = 0;&lt;br /&gt;
&lt;br /&gt;
private static synchronized void increment() {&lt;br /&gt;
  count++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public static void main(String[] args) {&lt;br /&gt;
  Thread a = new Thread(new Runnable() {&lt;br /&gt;
    public void run() {&lt;br /&gt;
      for(int i=0; i&amp;lt;1000; i++) {&lt;br /&gt;
        increment();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  Thread b = new Thread(new Runnable() {&lt;br /&gt;
    public void run() {&lt;br /&gt;
      for(int i=0; i&amp;lt;1000; i++) {&lt;br /&gt;
        increment();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  a.start();&lt;br /&gt;
  b.start();&lt;br /&gt;
  &lt;br /&gt;
  //Warten bis die Threads beendet wurden&lt;br /&gt;
  try {&lt;br /&gt;
    a.join();&lt;br /&gt;
  } catch(InterruptedException exc) {}&lt;br /&gt;
  try {&lt;br /&gt;
    b.join();&lt;br /&gt;
  } catch(InterruptedException exc) {}&lt;br /&gt;
  System.out.println(&amp;quot;Increments: &amp;quot;+(2000));&lt;br /&gt;
  System.out.println(&amp;quot;Actual count: &amp;quot;+count);&lt;br /&gt;
  System.out.println(&amp;quot;Difference: &amp;quot;+(2000 - count));&lt;br /&gt;
}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sam</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Letztes_Semester&amp;diff=1554</id>
		<title>Letztes Semester</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Letztes_Semester&amp;diff=1554"/>
		<updated>2021-02-19T09:17:58Z</updated>

		<summary type="html">&lt;p&gt;Sam: /* Jahresnote */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Da wir ja im letzten Semester wieder den super 50/50 Anwesenheitsmodus haben, hab ich mir folgendes überlegt.&lt;br /&gt;
&lt;br /&gt;
= Unterricht an der Schule =&lt;br /&gt;
Wir gehen pro Einheit 2 Bereiche vom Wiki durch. Am Nachmittag in der letzten Stunde gibts dann dazu eine Mitarbeitsüberprüfung, angepasst auf das was wir gelernt haben.&lt;br /&gt;
= Zuhause =&lt;br /&gt;
Ihr macht ein cooles Softwareprojekt, was euch gefällt. Voraussetzungen dazu:&lt;br /&gt;
* Ihr macht euch ein git Repository dafür&lt;br /&gt;
* Wenn ihr das Projekt angebt muss es für mich möglich sein das Projekt über das git Repository zu starten.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Irgend was feines mit React wäre eine gute Idee.&lt;br /&gt;
&lt;br /&gt;
= Notengebung =&lt;br /&gt;
== Noten zweites Semester ==&lt;br /&gt;
Siehe folgenden krassen Berechnungscode.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
package at.htldornbirn.swp.grade;&lt;br /&gt;
&lt;br /&gt;
public class GradeCalculator {&lt;br /&gt;
    public static int calculateGrade(float textGradeAvg, ProjectScore projectScore) {&lt;br /&gt;
        int grade = Math.round(textGradeAvg);&lt;br /&gt;
&lt;br /&gt;
        switch (projectScore) {&lt;br /&gt;
            case COOL:&lt;br /&gt;
                grade--;&lt;br /&gt;
                break;&lt;br /&gt;
            case AVERAGE:&lt;br /&gt;
                if (grade == 5) {&lt;br /&gt;
                    grade--;&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
            case WEEK:&lt;br /&gt;
                if (grade &amp;lt; 4) {&lt;br /&gt;
                    grade++;&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
            default:&lt;br /&gt;
                if (grade &amp;lt; 3) {&lt;br /&gt;
                    grade = 3;&lt;br /&gt;
                } else if (grade &amp;lt; 4) {&lt;br /&gt;
                    grade++;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return grade &amp;lt; 1 ? 1 : Math.min(grade, 5);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
== Jahresnote ==&lt;br /&gt;
Machma alle 1er...guade Ideeee&lt;/div&gt;</summary>
		<author><name>Sam</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Letztes_Semester&amp;diff=1553</id>
		<title>Letztes Semester</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Letztes_Semester&amp;diff=1553"/>
		<updated>2021-02-19T09:17:42Z</updated>

		<summary type="html">&lt;p&gt;Sam: /* Jahresnote */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Da wir ja im letzten Semester wieder den super 50/50 Anwesenheitsmodus haben, hab ich mir folgendes überlegt.&lt;br /&gt;
&lt;br /&gt;
= Unterricht an der Schule =&lt;br /&gt;
Wir gehen pro Einheit 2 Bereiche vom Wiki durch. Am Nachmittag in der letzten Stunde gibts dann dazu eine Mitarbeitsüberprüfung, angepasst auf das was wir gelernt haben.&lt;br /&gt;
= Zuhause =&lt;br /&gt;
Ihr macht ein cooles Softwareprojekt, was euch gefällt. Voraussetzungen dazu:&lt;br /&gt;
* Ihr macht euch ein git Repository dafür&lt;br /&gt;
* Wenn ihr das Projekt angebt muss es für mich möglich sein das Projekt über das git Repository zu starten.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Irgend was feines mit React wäre eine gute Idee.&lt;br /&gt;
&lt;br /&gt;
= Notengebung =&lt;br /&gt;
== Noten zweites Semester ==&lt;br /&gt;
Siehe folgenden krassen Berechnungscode.&lt;br /&gt;
{{JML|code=&lt;br /&gt;
package at.htldornbirn.swp.grade;&lt;br /&gt;
&lt;br /&gt;
public class GradeCalculator {&lt;br /&gt;
    public static int calculateGrade(float textGradeAvg, ProjectScore projectScore) {&lt;br /&gt;
        int grade = Math.round(textGradeAvg);&lt;br /&gt;
&lt;br /&gt;
        switch (projectScore) {&lt;br /&gt;
            case COOL:&lt;br /&gt;
                grade--;&lt;br /&gt;
                break;&lt;br /&gt;
            case AVERAGE:&lt;br /&gt;
                if (grade == 5) {&lt;br /&gt;
                    grade--;&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
            case WEEK:&lt;br /&gt;
                if (grade &amp;lt; 4) {&lt;br /&gt;
                    grade++;&lt;br /&gt;
                }&lt;br /&gt;
                break;&lt;br /&gt;
            default:&lt;br /&gt;
                if (grade &amp;lt; 3) {&lt;br /&gt;
                    grade = 3;&lt;br /&gt;
                } else if (grade &amp;lt; 4) {&lt;br /&gt;
                    grade++;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return grade &amp;lt; 1 ? 1 : Math.min(grade, 5);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
== Jahresnote ==&lt;br /&gt;
Schauen wir mal.&lt;br /&gt;
Machma alle 1er...guade Ideeee&lt;/div&gt;</summary>
		<author><name>Sam</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=UML_Sequenzdiagramm&amp;diff=835</id>
		<title>UML Sequenzdiagramm</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=UML_Sequenzdiagramm&amp;diff=835"/>
		<updated>2021-01-29T10:57:52Z</updated>

		<summary type="html">&lt;p&gt;Sam: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;* Was ist ein Sequenzdiagramm?&#039;&#039;&#039;&lt;br /&gt;
Ein Sequenzdiagramm ist ein Verhaltensdiagramm, welches eine Interaktion im Sinne der UML grafisch darstellt.&lt;br /&gt;
[[Datei:WIN 20181009 14 01 22 Pro.jpg|mini]]&lt;br /&gt;
&#039;&#039;&#039;* Wozu wird es benötigt?&#039;&#039;&#039;&lt;br /&gt;
Sequenzdiagramme dienen zur dynamischen Modellierung von Kommunikationsabläufen und Interaktionen zwischen Systemkomponenten. Der zeitliche Verlauf bekommt in dieser Darstellungsform eine besondere Bedeutung. &lt;br /&gt;
&lt;br /&gt;
Auch Sequenzdiagramme haben unterschiedliche Usecases. In der Entwicklung von Medizingeräten eignen sich Sequenzdiagramme besonders in den folgenden Szenarien:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verhaltensweise von Methoden:&#039;&#039;&#039; &lt;br /&gt;
Während der Softwareentwicklung werden Sequenzdiagramme überwiegend verwendet, um die Funktionsweise von Methoden bzw. Funktionen zu modellieren. Die Modellierung kann reverse stattfinden oder bereits zur Entscheidungsfindung zum Aufbau von Methoden verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zeitlicher Ablauf von Testfällen:&#039;&#039;&#039; &lt;br /&gt;
Auch die Dokumentation von Testfällen ist wichtig, um später Tests und mögliche Fehler reproduzieren zu können. Mithilfe des Sequenzdiagramms kann der zeitliche Ablauf der Tests beschrieben werden. Bilder sagen oft mehr als tausend Worte. Denken Sie aber daran, das Diagramm möglichst einfach zu gestalten, sodass es gut lesbar und leicht verständlich ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;System Usecases:&#039;&#039;&#039; &lt;br /&gt;
Auch in der obersten Modellierungsebene, der Systemebene, können Sequenzdiagramme verwendet werden, um die Usescases (z. dt. Anwendungsfälle) des Systems abzubilden. Besonders schwierige oder unklare Anwendungsfälle können so dokumentiert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;* Welche Elemente gibt es? Erkläre dies so detailliert und anschaulich wie möglich&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;• Option:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Optionen sind mit dem Struktogrammelement „einseitige Verzweigung“ vergleichbar. Der eingerahmte Bereich&lt;br /&gt;
wird bei Nichterfüllung der Bedingung&lt;br /&gt;
(genannt „Guard“) übersprungen. Es&lt;br /&gt;
muss aus dem Kontext erkennbar sein,&lt;br /&gt;
woher die Daten für die Bedingungsprüfung stammen.&lt;br /&gt;
Zur Kennzeichnung wird in den oberen&lt;br /&gt;
linken Bereich „opt“ notiert.&lt;br /&gt;
[[Datei:Option.jpg|mini|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;• Alternative:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alternativen kann man am Besten mit einer Merhfachauswahl&lt;br /&gt;
in der Struktogrammnotation&lt;br /&gt;
vergleichen. Sie haben mindestens zwei Zweige, wobei für jeden Zweig eine eigene Bedingung („Guard“) Formuliert&lt;br /&gt;
werden kann. Wichtig ist, dass&lt;br /&gt;
diese Bedingungen sich nicht&lt;br /&gt;
überschneiden („disjunkt&lt;br /&gt;
sind“). Bspw. „errorCount &amp;lt;=&lt;br /&gt;
3“ und „errorCount &amp;gt;= 3“&lt;br /&gt;
währe eine Verletzung dieser&lt;br /&gt;
Forderung.&lt;br /&gt;
[[Datei:Bbb.jpg|mini|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;• Schleife:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Struktogramme kennen drei verschiedene Schleifen – kopfgesteuerte, fußgesteuerte und&lt;br /&gt;
Zählschleifen. Beim Sequenzdiagram unterscheidet nicht zwischen kopfgesteuerten und fußgesteuerten Schleifen – diese&lt;br /&gt;
muss aus dem Kontext gelesen&lt;br /&gt;
werden – bzw. mit der Annahme&lt;br /&gt;
„kopfgesteuert“ kommt man&lt;br /&gt;
meist gut hin.&lt;br /&gt;
[[Datei:A.jpg|mini|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
* Erstelle ein paar anschauliche Beispiele&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sequenzdiagramm für das Datenverwaltungssystem eines Krankenhauses:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wie in vielen anderen Wirtschaftsbereichen auch hat der technische Fortschritt in der Medizin traditionelle Arbeitsabläufe und Berufsbilder einem grundlegenden Wandel unterworfen. Heute werden sämtliche Aktivitäten und Daten, die den Betrieb eines Krankenhauses ausmachen, mithilfe eines Datenverwaltungssystems gesteuert. Dazu zählen ärztliche Untersuchungen und andere klinische Verfahren, Verschreibungen für Medikamente, Termine, Krankenakten und weitere Informationen zu Patienten und ihren jeweiligen Betreuungspersonen. Das unten stehende Diagramm stellt die Beziehungen zwischen den Primärverfahren im Zeitverlauf in einer vereinfachten Übersicht dar. Mit Lucidchart können Sie das Diagramm beliebig anpassen und für Kollegen und Projektbeteiligte zur gemeinsamen Nutzung freigeben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:1.jpg|mini|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sequenzdiagramm für Geldautomatensysteme:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Am Geldautomaten können Bankkunden über einen komplett automatisierten Prozess auf ihre Konten zugreifen. Die einzelnen Schritte, aus denen dieser Prozess besteht, lassen sich anhand eines Sequenzdiagramms auf übersichtliche Weise darstellen. Das nachstehende Beispiel veranschaulicht die Reihenfolge der einzelnen Interaktionen des Geldautomatensystems. Sie können diese Vorlage bearbeiten und das Sequenzdiagramm entsprechend Ihren eigenen Bedürfnissen anpassen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:2.jpg|mini|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zusatzmaterial für die Füchsle unter uns:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Awd.jpg|mini|none]]&lt;br /&gt;
[[Datei:Aaa.jpg|mini|none]]&lt;br /&gt;
[[Datei:Amana.jpg|mini|none]]&lt;/div&gt;</summary>
		<author><name>Sam</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Objektorientiertes_Design_und_UML&amp;diff=223</id>
		<title>Objektorientiertes Design und UML</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Objektorientiertes_Design_und_UML&amp;diff=223"/>
		<updated>2021-01-08T13:23:00Z</updated>

		<summary type="html">&lt;p&gt;Sam: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im folgenden wird zuerst auf die Begriffe &#039;&#039;&#039;UML&#039;&#039;&#039; und &#039;&#039;&#039;modellieren&#039;&#039;&#039; eingegangen. In weiterer Folge werden wir uns mit zwei gebräuchlichen Diagrammtypen, dem &#039;&#039;&#039;Klassendiagramm&#039;&#039;&#039; und dem &#039;&#039;&#039;Sequenzdiagramm&#039;&#039;&#039; beschäftigen.&lt;br /&gt;
= Modellieren =&lt;br /&gt;
TODO: Hier soll beschrieben werden was &#039;&#039;&#039;modellieren&#039;&#039;&#039; im allgemeinen und dann speziell in der Softwareentwicklung bedeutet. &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Modellieren allgemeine Definition: &amp;lt;br&amp;gt;&lt;br /&gt;
plastisch formen, gestallten, bearbeiten, durch Modellieren bilden &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Modellieren in der Softwareentwicklung: &amp;lt;br&amp;gt;&lt;br /&gt;
Modellieren in der Softwareentwicklung wird auch Softwaredesign genannt. Softwaredesign ist oft wichtig wegen der Komplexität der Computerprogramme, um das Risiko der &amp;quot;Fehlentwicklung&amp;quot; zu minimieren. Bevor die Software modelliert wird, werden im Zuge der Anforderungserhebung zunächst die einzelnen Anforderungen designiert. Diese werden meistens von Auftraggeber und Auftragnehmer gemeinsam ausgesucht. &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modellieren wird also zur visuellen Darstellung von Programmen verwendet.&lt;br /&gt;
&lt;br /&gt;
= UML =&lt;br /&gt;
&lt;br /&gt;
Die Unified Modeling Language (UML), ist eine grafische Modellierungssprache zur Beschreibung von Softwaresystemen. Der Grundgedanke der UML besteht darin, eine einheitliche Notation für viele Einsatzgebiete zu haben.&lt;br /&gt;
&lt;br /&gt;
UML gilt als Standard zur Analyse und Design Objektorientierter Anwendungen. Sie bietet ein Gerüst, um so unterschiedliche Applikationen wie Datenbankanwendungen, Echtzeitsysteme oder Grafikprogramme einheitlich darstellen zu können. Die Aufgabe der UML ist Spezifikation, Visualisierung und Dokumentation von Modellen für Softwaresysteme.&lt;br /&gt;
&lt;br /&gt;
Die Diagramme in UML lassen sich in zwei Hauptgruppen aufteilen: Strukturdiagramm und Verhaltensdiagramme.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Strukturdiagramme:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Klassendiagramm&#039;&#039;&#039;&lt;br /&gt;
** Beschreibt die statische Struktur von Objekten in einem System und ihre Bezeichnung untereinander&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Kompositionsstrukturdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Zeigt einheitlich das Innere eines Klassifizierers (Metaklasse = Klasse einer Klasse) und dessen Wechselwirkung mit seiner Umgebung&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Komponentendiagramm&#039;&#039;&#039;&lt;br /&gt;
** Atellt die Zusammenhänge der einzelnen Komponenten einer zu erstellenden Softwarelösung dar.&lt;br /&gt;
** Die Darstellung umfasst dabei typischerweise Komponenten mit deren Schnittstellen bzw. Ports und wie Komponenten über Abhängigkeitsbeziehung und Konnektoren miteinander verbunden sind.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Verteilungsdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Beschreibt, welche Komponenten (Objekte) auf welchen Knoten ablaufen&lt;br /&gt;
** Zeigen daher, wie Komponenten konfiguriert sind und welche Abhängigkeiten bestehen&lt;br /&gt;
** Die Darstellung umfasst dabei typischerweise Rechnerknoten, Komponenten, Artefakte, Ausprägungsspezifikationen, Verbindungen und Verteilungsbeziehungen.&lt;br /&gt;
* &#039;&#039;&#039;Objektdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Zeigt die Struktur des modellierten Systems für einen limitierten Zeitabschnitt bzw. konkreten Zeitpunkt (Momentaufnahme).&lt;br /&gt;
** Die Darstellung umfasst dabei typischerweise Ausprägungsspezifikationen von Klassen und Assoziationen.&lt;br /&gt;
* &#039;&#039;&#039;Paketdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Dient der Strukturierung der verschiedenen Darstellungen.&lt;br /&gt;
** Pakete ermöglichen einen guten Überblick über ein Gesamtsystem (für große Systeme sehr wichtig)&lt;br /&gt;
** Die Darstellung umfasst dabei typischerweise Pakete, Paketverschmelzungen, Paketimports und Abhängigkeitsbeziehungen.&lt;br /&gt;
* &#039;&#039;&#039;Profildiagramm&#039;&#039;&#039;&lt;br /&gt;
** Wird in der Metamodellebene verwendet, um sogenannte Stereotype mit Klassen anzuzeigen&lt;br /&gt;
** Diese haben dann die Bezeichnung &amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt; oder bei Profilen und Paketen &amp;lt;&amp;lt;profile&amp;gt;&amp;gt; bekommen.&lt;br /&gt;
&#039;&#039;&#039;Verhaltensdiagramme&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Aktivitätsdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Es wird meist der Ablauf eines Anwendungsfalls beschrieben, es eignet sich aber zur Modellierung aller Aktivitäten innerhalb eines Systems.&lt;br /&gt;
* &#039;&#039;&#039;Anwendungsfalldiagramm&#039;&#039;&#039; (Use-Case Diagramm)&lt;br /&gt;
** Beschreibt das Zusammenwirken von Personen (Aktoren) mit einem System.&lt;br /&gt;
** Es stellt Anwendungsfälle und Akteure mit ihren jeweiligen Abhängigkeiten und Beziehungen dar.&lt;br /&gt;
* &#039;&#039;&#039;Interaktionsübersichtsdiagramm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Kommunikationsdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Stellt den Austausch von Nachrichten dar.&lt;br /&gt;
* &#039;&#039;&#039;Sequenzdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Stellt die einzelnen Objekte und ihre Interaktion (auf zeitlichen Ablauf bezogen) dar&lt;br /&gt;
* &#039;&#039;&#039;Zeitverlaufsdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Ist ein zweidimensionales Diagramm, wobei auf der x-Achse die Zeit, und auf der y-Achse Zustände von Objekten aufgetragen werden.&lt;br /&gt;
** Dieser Diagrammtyp ähnelt damit der Anzeige eines Oszilloskops, wird also seit langem in der Elektrotechnik verwendet.&lt;br /&gt;
* &#039;&#039;&#039;Zustandsdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Visualisiert die unterschiedlichsten Zustände, die Objekte in ihrem Leben annehmen können&lt;br /&gt;
** Wird benutzt, um das Verhalten eines Systems oder die zulässige Nutzung der Schnittstellen eines Systems zu spezifizieren&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Diagramme ==&lt;br /&gt;
[[UML_Klassendiagramm|UML Klassendiagramm]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[UML_Sequenzdiagramm|UML Sequenzdiagramm]]&lt;br /&gt;
&lt;br /&gt;
= TODO: Bitte Beachten =&lt;br /&gt;
Wenn möglich versuche die Quellen für die Information zu nennen. Wir nehmen das hier nicht so genau, aber es sollte möglich sein die entsprechende Seite aus der die Information entnommen wurde zu finden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Bilder bitte direkt mit Quelle (Beispiel)&lt;br /&gt;
[[Datei:Bubble-sort-example-300px.gif|mini|none|Funktionsweise Bubblesort. Quelle: https://de.wikipedia.org/wiki/Bubblesort]]&lt;/div&gt;</summary>
		<author><name>Sam</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Objektorientiertes_Design_und_UML&amp;diff=199</id>
		<title>Objektorientiertes Design und UML</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Objektorientiertes_Design_und_UML&amp;diff=199"/>
		<updated>2021-01-08T11:08:27Z</updated>

		<summary type="html">&lt;p&gt;Sam: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im folgenden wird zuerst auf die Begriffe &#039;&#039;&#039;UML&#039;&#039;&#039; und &#039;&#039;&#039;modellieren&#039;&#039;&#039; eingegangen. In weiterer Folge werden wir uns mit zwei gebräuchlichen Diagrammtypen, dem &#039;&#039;&#039;Klassendiagramm&#039;&#039;&#039; und dem &#039;&#039;&#039;Sequenzdiagramm&#039;&#039;&#039; beschäftigen.&lt;br /&gt;
= Modellieren =&lt;br /&gt;
TODO: Hier soll beschrieben werden was &#039;&#039;&#039;modellieren&#039;&#039;&#039; im allgemeinen und dann speziell in der Softwareentwicklung bedeutet. &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Modellieren allgemeine Definition: &amp;lt;br&amp;gt;&lt;br /&gt;
plastisch formen, gestallten, bearbeiten, durch Modellieren bilden &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Modellieren in der Softwareentwicklung: &amp;lt;br&amp;gt;&lt;br /&gt;
Modellieren in der Softwareentwicklung wird auch Softwaredesign genannt. Softwaredesign ist oft wichtig wegen der Komplexität der Computerprogramme, um das Risiko der &amp;quot;Fehlentwicklung&amp;quot; zu minimieren. Bevor die Software modelliert wird, werden im Zuge der Anforderungserhebung zunächst die einzelnen Anforderungen designiert. Diese werden meistens von Auftraggeber und Auftragnehmer gemeinsam ausgesucht. &lt;br /&gt;
&lt;br /&gt;
= UML =&lt;br /&gt;
&lt;br /&gt;
Die Unified Modeling Language (UML), ist eine grafische Modellierungssprache zur Beschreibung von Softwaresystemen. Der Grundgedanke der UML besteht darin, eine einheitliche Notation für viele Einsatzgebiete zu haben.&lt;br /&gt;
&lt;br /&gt;
UML gilt als Standard zur Analyse und Design Objektorientierter Anwendungen. Sie bietet ein Gerüst, um so unterschiedliche Applikationen wie Datenbankanwendungen, Echtzeitsysteme oder Grafikprogramme einheitlich darstellen zu können. Die Aufgabe der UML ist Spezifikation, Visualisierung und Dokumentation von Modellen für Softwaresysteme.&lt;br /&gt;
&lt;br /&gt;
Die Diagramme in UML lassen sich in zwei Hauptgruppen aufteilen: Strukturdiagramm und Verhaltensdiagramme.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Strukturdiagramme:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Klassendiagramm&#039;&#039;&#039;&lt;br /&gt;
** Beschreibt die statische Struktur von Objekten in einem System und ihre Bezeichnung untereinander&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Kompositionsstrukturdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Zeigt einheitlich das Innere eines Klassifizierers (Metaklasse = Klasse einer Klasse) und dessen Wechselwirkung mit seiner Umgebung&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Komponentendiagramm&#039;&#039;&#039;&lt;br /&gt;
** Atellt die Zusammenhänge der einzelnen Komponenten einer zu erstellenden Softwarelösung dar.&lt;br /&gt;
** Die Darstellung umfasst dabei typischerweise Komponenten mit deren Schnittstellen bzw. Ports und wie Komponenten über Abhängigkeitsbeziehung und Konnektoren miteinander verbunden sind.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Verteilungsdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Beschreibt, welche Komponenten (Objekte) auf welchen Knoten ablaufen&lt;br /&gt;
** Zeigen daher, wie Komponenten konfiguriert sind und welche Abhängigkeiten bestehen&lt;br /&gt;
** Die Darstellung umfasst dabei typischerweise Rechnerknoten, Komponenten, Artefakte, Ausprägungsspezifikationen, Verbindungen und Verteilungsbeziehungen.&lt;br /&gt;
* &#039;&#039;&#039;Objektdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Zeigt die Struktur des modellierten Systems für einen limitierten Zeitabschnitt bzw. konkreten Zeitpunkt (Momentaufnahme).&lt;br /&gt;
** Die Darstellung umfasst dabei typischerweise Ausprägungsspezifikationen von Klassen und Assoziationen.&lt;br /&gt;
* &#039;&#039;&#039;Paketdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Dient der Strukturierung der verschiedenen Darstellungen.&lt;br /&gt;
** Pakete ermöglichen einen guten Überblick über ein Gesamtsystem (für große Systeme sehr wichtig)&lt;br /&gt;
** Die Darstellung umfasst dabei typischerweise Pakete, Paketverschmelzungen, Paketimports und Abhängigkeitsbeziehungen.&lt;br /&gt;
* &#039;&#039;&#039;Profildiagramm&#039;&#039;&#039;&lt;br /&gt;
** Wird in der Metamodellebene verwendet, um sogenannte Stereotype mit Klassen anzuzeigen&lt;br /&gt;
** Diese haben dann die Bezeichnung &amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt; oder bei Profilen und Paketen &amp;lt;&amp;lt;profile&amp;gt;&amp;gt; bekommen.&lt;br /&gt;
&#039;&#039;&#039;Verhaltensdiagramme&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Aktivitätsdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Es wird meist der Ablauf eines Anwendungsfalls beschrieben, es eignet sich aber zur Modellierung aller Aktivitäten innerhalb eines Systems.&lt;br /&gt;
* &#039;&#039;&#039;Anwendungsfalldiagramm&#039;&#039;&#039; (Use-Case Diagramm)&lt;br /&gt;
** Beschreibt das Zusammenwirken von Personen (Aktoren) mit einem System.&lt;br /&gt;
** Es stellt Anwendungsfälle und Akteure mit ihren jeweiligen Abhängigkeiten und Beziehungen dar.&lt;br /&gt;
* &#039;&#039;&#039;Interaktionsübersichtsdiagramm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Kommunikationsdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Stellt den Austausch von Nachrichten dar.&lt;br /&gt;
* &#039;&#039;&#039;Sequenzdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Stellt die einzelnen Objekte und ihre Interaktion (auf zeitlichen Ablauf bezogen) dar&lt;br /&gt;
* &#039;&#039;&#039;Zeitverlaufsdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Ist ein zweidimensionales Diagramm, wobei auf der x-Achse die Zeit, und auf der y-Achse Zustände von Objekten aufgetragen werden.&lt;br /&gt;
** Dieser Diagrammtyp ähnelt damit der Anzeige eines Oszilloskops, wird also seit langem in der Elektrotechnik verwendet.&lt;br /&gt;
* &#039;&#039;&#039;Zustandsdiagramm&#039;&#039;&#039;&lt;br /&gt;
** Visualisiert die unterschiedlichsten Zustände, die Objekte in ihrem Leben annehmen können&lt;br /&gt;
** Wird benutzt, um das Verhalten eines Systems oder die zulässige Nutzung der Schnittstellen eines Systems zu spezifizieren&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Diagramme ==&lt;br /&gt;
[[UML_Klassendiagramm|UML Klassendiagramm]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[UML_Sequenzdiagramm|UML Sequenzdiagramm]]&lt;br /&gt;
&lt;br /&gt;
= TODO: Bitte Beachten =&lt;br /&gt;
Wenn möglich versuche die Quellen für die Information zu nennen. Wir nehmen das hier nicht so genau, aber es sollte möglich sein die entsprechende Seite aus der die Information entnommen wurde zu finden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Bilder bitte direkt mit Quelle (Beispiel)&lt;br /&gt;
[[Datei:Bubble-sort-example-300px.gif|mini|none|Funktionsweise Bubblesort. Quelle: https://de.wikipedia.org/wiki/Bubblesort]]&lt;/div&gt;</summary>
		<author><name>Sam</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Objektorientiertes_Design_und_UML&amp;diff=183</id>
		<title>Objektorientiertes Design und UML</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Objektorientiertes_Design_und_UML&amp;diff=183"/>
		<updated>2021-01-08T10:28:13Z</updated>

		<summary type="html">&lt;p&gt;Sam: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im folgenden wird zuerst auf die Begriffe &#039;&#039;&#039;UML&#039;&#039;&#039; und &#039;&#039;&#039;modellieren&#039;&#039;&#039; eingegangen. In weiterer Folge werden wir uns mit zwei gebräuchlichen Diagrammtypen, dem &#039;&#039;&#039;Klassendiagramm&#039;&#039;&#039; und dem &#039;&#039;&#039;Sequenzdiagramm&#039;&#039;&#039; beschäftigen.&lt;br /&gt;
= Modellieren =&lt;br /&gt;
TODO: Hier soll beschrieben werden was &#039;&#039;&#039;modellieren&#039;&#039;&#039; im allgemeinen und dann speziell in der Softwareentwicklung bedeutet. &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Modellieren allgemeine Definition: &amp;lt;br&amp;gt;&lt;br /&gt;
plastisch formen, gestallten, bearbeiten, durch Modellieren bilden &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Modellieren in der Softwareentwicklung: &amp;lt;br&amp;gt;&lt;br /&gt;
Modellieren in der Softwareentwicklung wird auch Softwaredesign genannt. Softwaredesign ist oft wichtig wegen der Komplexität der Computerprogramme, um das Risiko der &amp;quot;Fehlentwicklung&amp;quot; zu minimieren. Bevor die Software modelliert wird, werden im Zuge der Anforderungserhebung zunächst die einzelnen Anforderungen designiert. Diese werden meistens von Auftraggeber und Auftragnehmer gemeinsam ausgesucht.&lt;br /&gt;
&lt;br /&gt;
= UML =&lt;br /&gt;
TODO: Hier soll geklärt werden was UML ist, von der Begriffsbedeutung bis hin zu den Einsatzgebieten in der Softwareentwicklung. Weiters sollen alle Diagrammtypen und deren Einteilung in Kategorien schön dargestellt werden. Füge zu jedem Diagrammtyp eine ganz Kurze Beschreibung hinzu (gerne in einer weiteren Aufzählung).&lt;br /&gt;
&lt;br /&gt;
== Diagramme ==&lt;br /&gt;
[[UML_Klassendiagramm|UML Klassendiagramm]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[UML_Sequenzdiagramm|UML Sequenzdiagramm]]&lt;br /&gt;
&lt;br /&gt;
= TODO: Bitte Beachten =&lt;br /&gt;
Wenn möglich versuche die Quellen für die Information zu nennen. Wir nehmen das hier nicht so genau, aber es sollte möglich sein die entsprechende Seite aus der die Information entnommen wurde zu finden.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Bilder bitte direkt mit Quelle (Beispiel)&lt;br /&gt;
[[Datei:Bubble-sort-example-300px.gif|mini|none|Funktionsweise Bubblesort. Quelle: https://de.wikipedia.org/wiki/Bubblesort]]&lt;/div&gt;</summary>
		<author><name>Sam</name></author>
	</entry>
</feed>