Software-Engineering (1): Objektorientierte Software

1 Modularisierung

1.1 Hintergrund

bisher:

jetzt:

1.2 Arten von Modulen

1.2.1 Unterprogramm (UPRO)

1.2.2 Funktion

2 Arbeiten mit Zeichen und Zeichenketten

2.1 Zeichen

2.1.1 Konstanten

2.1.2 Variablen

2.2 Zeichenketten

Hintergrund:
vorstellbar als eine Aneinanderreihung einzelner Zeichen
Konstanten:
... bekannt ... in Gänsefüßchen einzuschließen, z.B. "Hallo"
Besonderheiten:
  • eine Zeichenkette bestehend aus 1 Zeichen, z.B. "?" (NICHT verwechseln mit Zeichen '?'
  • eine leere Zeichenkette besitzt kein einziges Zeichen, dargestellt als ""
Variablen:
  • zu verwalten unter Verwendung des NICHT primitiven (benutzerdefinierten) Datentyps String
  • das Definieren einer Variablen vom Typ String:
    String Bezeichner; //ohne Initialisierung

    bzw.
    String Bezeichner = Initialisierungswert; //mit Initialisierung
    Beispiele:
    String
    d.h. eine Variable vom Typ String ist (wie bei Array) eine Referenzvariable!
    diese kann die Adresse eines String-Objekts aufnehmen.
    String Objekte können nicht verändert werden!!!
    (eine String-Variable kann auf ein anderes String-Objekt verweisen)

2.3 Möglichkeiten für String-Objekte

2.3.1 Ermitteln, aus wievielen Zeichen ein String-Objekt besteht: "String-Länge" ermitteln ...

Stringlänge ermitteln
Syntax Beschreibung
Bezeichner.length() die Ermittlung der "String-Länge" erfolgt NICHT (wie bei Arrays) über eine Komponente length, sondern über eine Methode length(), also ohne Parameter
String s1 = "Guten Morgen";
int Laenge = s1.length(); ⇒ 12

2.3.2 Ein bestimmtes Zeichen (char) aus einem String-Objekt "holen"

Zeichen extrahieren
Syntax Beschreibung
Bezeichner.charAt(Position) mit Position: ein int-Wert zwischen 0 und String-Länge - 1
String s2 = "Hallo";
System.out.println("1. Zeichen: " + s2.charAt(0));
char letztesZeichen = s2.charAt(s2.length()-1);

2.3.3 eine Teilzeichenkette aus einem String -Objekt "herausholen"

String aus String extrahieren
Syntax Beschreibung
substring(abPosition,bisPosition) diese Methode liefert ein neues String-Objekt mit bisPosition - abPosition Zeichen
das erste Zeichen des Ergebnisses ist DAS Zeichen an der abPosition im Ausgangsstring
String s = "Wochenende";
System.out.println(s.substring(4,7)); //  ene
substring(abPosition) liefert ein neues String-Objekt, dessen erstes Zeichen das Zeichen an der abPosition im Ausgangsstring ist und alle folgende
System.out.println(s.substring(6);  //  ende
System.out.println(s.substring(6, s.length());  //  ende

2.3.4 Vergleichen zweier String-Objekte

Vergleich von Strings
Syntax Beschreibung
equals(andererString)
  • Vergleich auf EXAKTE Gleichheit
  • Ergebnis ist vom Typ boolean
String s1, s2;
... über Eingaben versorgen ...
if (s1.equals(s2))
    System.out.println("gleich")
else
    System.out.println("unterschiedlich")
equalsIgnoreCase(andererString)
  • case-Insensitiver Vergleich auf Gleichheit
compareTo(andererString) String-Objekte "lexikalisch" vergleichen

liefert ein int-Ergebnis ab:
  • positiv: "aktueller String" ist größer als andererString
  • negativ: "aktueller String" ist kleiner als andererString
  • 0: "aktueller String" ist gleich dem andererString
compareToIgnoreCase(andererString) ... wie oben ... Groß- Kleinschreibung wirdignoriert

2.3.5 "Umwandeln" in NUR Groß- bzw. Kleinbuchstaben

Groß-/Kleinschreibung beeinflussen
Syntax Beschreibung
toUpperCase liefert ein neues String-Objekt, in dem alle urpsrünglich klein geschriebenen Buchstaben als Großbuchstaben auftauchen
toLowerCase liefert ein neues String-Objekt, in dem alle urpsrünglich groß geschriebenen Buchstaben als Kleinbuchstaben auftauchen
z.B. Erweiterung der "Palindrom-Funktion":
public static boolean palin(String s)
{
    s = s.toUpperCase();
    Rest wie gehabt ...
}

2.3.6 "Suchen" in Strings

Suchen in Strings
Syntax Beschreibung
indexOf(Zeichen) liefert als Ergebnis die Position des zu suchenden Zeichens im "aktuellen" String ab, sofern vorhanden, ansonsten -1

dabei wird NUR das erste Vorkommen berücksichtigt!
indexOf(Zeichen, abPosition) ... jetzt Beginn der Suche an der abPosition

Ergebnis-Position wieder relativ zum Beginn!
lastIndexOf(Zeichen) liefert als Ergebnis die Position des letzten Vorkommens des Zeichens, bzw. -1

JEDER dieser Methoden kann anstelle eines Zeichen auch einen "Teil-String" übergeben werden!

3 Benutzerdefinierte Datentypen (Klassen)

3.1 Allgemeines

3.2 Vorgehensweise und Begriffe

3.2.1 Konkret

(1) Konstruktoren:
Solange in einer Klasse noch kein einziger Konstruktor definiert ist, generiert der Compiler einen "nichts tuenden" parameterlosen Konstruktor (" Default-Konstruktor")
verschiedene Arten von Konstruktoren:
  1. Standard-Konstruktor: ohne Parameter
  2. "Typischer"-Konstruktor: hat soviele Parameter wie es Attribute in der Klasse gibt
  3. Copy-Konstruktor: hat 1 Parameter vom Typ der Klasse, überträgt die Attributwerte aus dem Parameter-Objekt in das neu entstehende Objekt
  4. weitere fachspezifische Konstruktoren
Sinn:
ein Objekt bei seiner Entstehung initialisieren;
Die EINZIGE Möglichkeit, eine Klasse zu intstanziieren, ist die Benutzung der new-Operation!
Konstruktor
Syntax:
Zugriffsberechtigung Klassenname(Parameterliste)
{
    ...
}
Besonderheiten:
  • KEIN Methodentyp !!!
  • fest vorgegebener Methodenname(==Klassenname)
  • typischerweise public
  • Parameterliste kann auch leer sein; unterschiedliche Konstruktoren müssen unterschiedliche Parameterliste besitzen
Beispiel:
siehe Klasse Zeit ...
Klasse Zeit
(2) Akzessoren
  1. Getter:
    public Attributdatentyp getAttributname()
    {
        return Attributname;
    }
    je Attribut 1 Getter-Methode
    Beispiel:
    private int stunde, ...;
    ...
    public int getStunde()
    {
        return stunde;
    }
  2. Setter:
    public void setAttributname(Attributdatentyp bezeichner)
    {
        Attributname = bezeichner; //sofern keine Prüfung nötig
    }
    Beispiel:
    public void setStunde(int std)
    {
        stunde = std;
    }
(c) "Aufbereitung" der Attributwerte als String
public String toString()
{
    ...
    return etwasVomTypString;
}
Diese Methode wird AUTOMATISCH aufgerufen, wenn eine Klassen-Referenz in einem Kontext angegeben wird, in dem ein String erwartet wird;
z.B.: bei Standardausgabe:
System.out.println(Klassenreferenz); System.out.println(Klassenreferenz.toString());
z.B.: in der Klasse Zeit
public String toString()
{
    return String.format("%d:%02d:%02d%n", stunde, minute, sekunde);
}

3.3 Das Schlüsselwort this