Java meistern: Objekte, Klassen und Kern-OOP-Konzepte verstehen
Java ist eine objektorientierte Sprache. Als Sprache mit objektorientierten Features unterstützt Java folgende fundamentale Konzepte:
- Polymorphie
- Vererbung
- Kapselung
- Abstraktion
- Klassen
- Objekte
- Instanzen
- Methoden
- Nachrichtenübermittlung
In diesem Kapitel betrachten wir die Konzepte Klassen und Objekte.
Objekt – Objekte haben Zustände und Verhaltensweisen. Beispiel: Ein Hund hat Zustände – Farbe, Name, Rasse – sowie Verhaltensweisen – Schwanzwedeln, Bellen, Fressen. Ein Objekt ist eine Instanz einer Klasse.
Klasse – Eine Klasse kann als Vorlage/Blaupause definiert werden, die das Verhalten/die Zustände beschreibt, die Objekte ihres Typs unterstützen.
Objekte in Java
Sehen wir nun genauer, was Objekte sind. In der realen Welt finden wir viele Objekte um uns herum: Autos, Hunde, Menschen usw. All diese Objekte haben einen Zustand und ein Verhalten.
Betrachten wir einen Hund: Sein Zustand ist – Name, Rasse, Farbe – und sein Verhalten – Bellen, Schwanzwedeln, Laufen.
Vergleicht man Softwareobjekte mit realen Objekten, haben sie sehr ähnliche Eigenschaften.
Softwareobjekte haben ebenfalls einen Zustand und ein Verhalten. Der Zustand eines Softwareobjekts wird in Feldern gespeichert und das Verhalten wird über Methoden gezeigt.
In der Softwareentwicklung operieren Methoden auf dem internen Zustand eines Objekts und die Objekt-zu-Objekt-Kommunikation erfolgt über Methoden.
Klassen in Java
Eine Klasse ist eine Blaupause, von der individuelle Objekte erstellt werden.
Folgendes ist ein Beispiel für eine Klasse:
Beispiel
public class Dog {
String breed;
int age;
String color;
void barking() { }
void hungry() { }
void sleeping() { }
}
Eine Klasse kann folgende Variablentypen enthalten:
Lokale Variablen – Variablen, die innerhalb von Methoden, Konstruktoren oder Blöcken definiert sind. Die Variable wird innerhalb der Methode deklariert und initialisiert und zerstört, wenn die Methode abgeschlossen ist.
Instanzvariablen – Variablen innerhalb einer Klasse, aber außerhalb jeder Methode. Diese Variablen werden initialisiert, wenn die Klasse instanziiert wird. Instanzvariablen können von innerhalb jeder Methode, jedes Konstruktors oder Blocks dieser Klasse zugegriffen werden.
Klassenvariablen – Variablen, die innerhalb einer Klasse, außerhalb jeder Methode, mit dem Schlüsselwort
staticdeklariert sind.
Eine Klasse kann beliebig viele Methoden haben, um auf die Werte verschiedener Arten von Methoden zuzugreifen. Im obigen Beispiel sind barking(), hungry() und sleeping() Methoden.
Folgende wichtige Themen müssen besprochen werden, wenn man sich Klassen in Java ansieht:
Konstruktoren
Beim Thema Klassen ist einer der wichtigsten Unterpunkte die Konstruktoren. Jede Klasse hat einen Konstruktor. Wenn wir nicht explizit einen Konstruktor für eine Klasse schreiben, erstellt der Java-Compiler einen Standardkonstruktor für diese Klasse.
Jedes Mal, wenn ein neues Objekt erstellt wird, wird mindestens ein Konstruktor aufgerufen. Die Hauptregel für Konstruktoren ist, dass sie denselben Namen wie die Klasse haben müssen. Eine Klasse kann mehr als einen Konstruktor haben.
Folgendes ist ein Beispiel für einen Konstruktor:
Beispiel
public class Puppy {
public Puppy() { }
public Puppy(String name) {
// Dieser Konstruktor hat einen Parameter, name.
}
}
Java unterstützt auch Singleton-Klassen, bei denen Sie nur eine Instanz einer Klasse erstellen können.
Hinweis – Es gibt zwei verschiedene Arten von Konstruktoren. Wir werden Konstruktoren in den nachfolgenden Kapiteln detailliert besprechen.
Objekt erstellen
Wie bereits erwähnt, stellt eine Klasse die Blaupausen für Objekte bereit. Ein Objekt wird also aus einer Klasse erstellt. In Java wird das Schlüsselwort new verwendet, um neue Objekte zu erstellen.
Es gibt drei Schritte beim Erstellen eines Objekts aus einer Klasse:
Deklaration – Variablendeklaration mit einem Variablennamen und Objekttyp.
Instanziierung – Das Schlüsselwort
newwird verwendet, um das Objekt zu erstellen.Initialisierung – Dem Schlüsselwort
newfolgt ein Aufruf eines Konstruktors. Dieser Aufruf initialisiert das neue Objekt.
Folgendes ist ein Beispiel für die Erstellung eines Objekts:
Beispiel
Live Demopublic class Puppy {
public Puppy(String name) {
// Dieser Konstruktor hat einen Parameter, name.
System.out.println("Passed Name is :" + name);
}
public static void main(String []args) {
// Folgendes Statement würde ein Objekt myPuppy erstellen
Puppy myPuppy = new Puppy("tommy");
}
}
Wenn wir das obige Programm kompilieren und ausführen, erhalten wir folgendes Ergebnis:
Ausgabe
Passed Name is :tommy
Zugriff auf Instanzvariablen und Methoden
Instanzvariablen und Methoden werden über erstellte Objekte zugegriffen. Um auf eine Instanzvariable zuzugreifen, ist der vollständig qualifizierte Pfad:
/* Zuerst ein Objekt erstellen */ ObjectReference = new Constructor(); /* Jetzt Variable aufrufen */ ObjectReference.variableName; /* Jetzt Klassenmethode aufrufen */ ObjectReference.MethodName();
Beispiel
Dieses Beispiel erklärt, wie man auf Instanzvariablen und Methoden einer Klasse zugreift.
Live Demopublic class Puppy {
int puppyAge;
public Puppy(String name) {
System.out.println("Name chosen is :" + name);
}
public void setAge(int age) {
puppyAge = age;
}
public int getAge() {
System.out.println("Puppy's age is :" + puppyAge);
return puppyAge;
}
public static void main(String []args) {
/* Objekterstellung */
Puppy myPuppy = new Puppy("tommy");
/* Klassenmethode aufrufen, um Alter zu setzen */
myPuppy.setAge(2);
/* Andere Klassenmethode aufrufen, um Alter zu erhalten */
myPuppy.getAge();
/* Instanzvariable direkt zugreifen */
System.out.println("Variable Value :" + myPuppy.puppyAge);
}
}
Kompilieren und Ausführen des obigen Programms ergibt:
Ausgabe
Name chosen is :tommy Puppy's age is :2 Variable Value :2
Quelldatei-Deklarationsregeln
Als letzten Teil dieses Abschnitts betrachten wir die Quelldatei-Deklarationsregeln. Diese Regeln sind essenziell beim Deklarieren von Klassen, import- und package-Statements in einer Quelldatei.
Es kann nur eine öffentliche Klasse pro Quelldatei geben.
Eine Quelldatei kann mehrere nicht-öffentliche Klassen haben.
Der Name der öffentlichen Klasse sollte auch der Name der Quelldatei sein, angehängt mit .java. Beispiel: Klassenname ist public class Employee{}, dann sollte die Quelldatei Employee.java heißen.
Wenn die Klasse in einem Package definiert ist, sollte das Package-Statement das erste Statement in der Quelldatei sein.
Wenn import-Statements vorhanden sind, müssen sie zwischen dem Package-Statement und der Klassendeklaration stehen. Falls keine Package-Statements vorhanden sind, sollte das import-Statement die erste Zeile in der Quelldatei sein.
Import- und Package-Statements gelten für alle Klassen in der Quelldatei. Es ist nicht möglich, unterschiedliche Import- und/oder Package-Statements für verschiedene Klassen in der Quelldatei zu deklarieren.
Klassen haben mehrere Zugriffsebenen und es gibt verschiedene Arten von Klassen: abstrakte Klassen, finale Klassen usw. Wir werden all dies im Kapitel über Zugriffsmodifikatoren erklären.
Abgesehen von den oben genannten Klassentypen hat Java auch spezielle Klassen, die innere Klassen (Inner Classes) und anonyme Klassen (Anonymous Classes) genannt werden.
Java Package
Einfach ausgedrückt ist es eine Möglichkeit, Klassen und Interfaces zu kategorisieren. Bei der Entwicklung von Anwendungen in Java werden hunderte von Klassen und Interfaces geschrieben, daher ist die Kategorisierung dieser Klassen ein Muss und macht das Leben viel einfacher.
Import-Statements
In Java, wenn ein vollqualifizierter Name, der das Package und den Klassennamen enthält, angegeben wird, kann der Compiler den Quellcode oder die Klassen leicht finden. Ein Import-Statement ist eine Möglichkeit, dem Compiler den richtigen Ort für die jeweilige Klasse anzugeben.
Zum Beispiel würde die folgende Zeile den Compiler auffordern, alle Klassen im Verzeichnis java_installation/java/io zu laden:
import java.io.*;
Ein einfaches Fallbeispiel
Für unsere Fallstudie erstellen wir zwei Klassen: Employee und EmployeeTest.
Öffnen Sie zuerst den Editor und fügen Sie den folgenden Code hinzu. Dies ist die Employee-Klasse und die Klasse ist öffentlich. Speichern Sie diese Quelldatei als Employee.java.
Die Employee-Klasse hat vier Instanzvariablen: name, age, designation und salary. Die Klasse hat einen explizit definierten Konstruktor, der einen Parameter annimmt.
Beispiel
import java.io.*;
public class Employee {
String name;
int age;
String designation;
double salary;
// Konstruktor der Klasse Employee
public Employee(String name) {
this.name = name;
}
// Alter des Mitarbeiters zuweisen
public void empAge(int empAge) {
age = empAge;
}
// Bezeichnung zuweisen
public void empDesignation(String empDesig) {
designation = empDesig;
}
// Gehalt zuweisen
public void empSalary(double empSalary) {
salary = empSalary;
}
// Mitarbeiterdetails ausgeben
public void printEmployee() {
System.out.println("Name:"+ name);
System.out.println("Age:" + age);
System.out.println("Designation:" + designation);
System.out.println("Salary:" + salary);
}
}
Wie bereits erwähnt, beginnt die Verarbeitung bei der main-Methode. Daher muss es für die Ausführung dieser Employee-Klasse eine main-Methode geben und Objekte müssen erstellt werden. Wir erstellen eine separate Klasse dafür.
Folgendes ist die EmployeeTest-Klasse, die zwei Instanzen der Klasse Employee erstellt und die Methoden für jedes Objekt aufruft, um Werte für jede Variable zuzuweisen.
Speichern Sie den folgenden Code in EmployeeTest.java.
import java.io.*;
public class EmployeeTest {
public static void main(String args[]) {
/* Zwei Objekte mit Konstruktor erstellen */
Employee empOne = new Employee("James Smith");
Employee empTwo = new Employee("Mary Anne");
// Methoden für jedes erstellte Objekt aufrufen
empOne.empAge(26);
empOne.empDesignation("Senior Software Engineer");
empOne.empSalary(1000);
empOne.printEmployee();
empTwo.empAge(21);
empTwo.empDesignation("Software Engineer");
empTwo.empSalary(500);
empTwo.printEmployee();
}
}
Kompilieren Sie nun beide Klassen und führen Sie EmployeeTest aus, um das folgende Ergebnis zu sehen:
Ausgabe
C:\> javac Employee.java C:\> javac EmployeeTest.java C:\> java EmployeeTest Name:James Smith Age:26 Designation:Senior Software Engineer Salary:1000.0 Name:Mary Anne Age:21 Designation:Software Engineer Salary:500.0
Was kommt als Nächstes?
In der nächsten Sitzung besprechen wir die grundlegenden Datentypen in Java und wie sie bei der Entwicklung von Java-Anwendungen verwendet werden können.
Java
- C# Klassen & Objekte: Fundamente für robustes OOP
- C++ Klassen & Objekte: Praktischer Leitfaden zur objektorientierten Programmierung
- C++ Friend-Funktionen und Friend-Klassen: Zugriffskontrolle meistern
- Java Variablen und Literale: Umfassender Leitfaden
- Java Klassen und Objekte: Praktischer Leitfaden
- Javas final-Schlüsselwort verstehen: Variablen, Methoden und Klassen
- Java instanceof-Operator: Ein umfassender Leitfaden
- Java abstrakte Klassen und Methoden: Ein umfassender Leitfaden
- Java verschachtelte und innere Klassen meistern: Typen, Beispiele und Best Practices
- Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele