Objekte in einem Java-Programm?

3 Antworten

Implizit zur Verfügung stehenden Objekten

An der Stelle müsste man wohl einmal definieren, wovon du genau redest.

Es gibt in J2EE (JSP/JSF) bspw. sogenannte implizite Objekte (z.B. application, view, session), die in EL Expressions verwendet werden. Diese Objekte werden im Hintergrund für dich angelegt, ohne das du sie definieren musst. Über sie kannst du bspw. auf den aktuellen Seitenkontext zugreifen, aktuelle Session, o.ä.. Das ist allerdings keine Besonderheit der Sprache Java, sondern etwas, was als Beiwerk zu einem integrierten Übersetzungstool implementiert wurde.

Oder vielleicht redest du von String interning?

String word = "word";

Bei diesem besonderen Fall (der nur für Strings gilt), wird erst in einem String Pool geschaut, ob es das Objekt mit dem Wert bereits gibt. Wenn ja, wird das bereits vorhandene Objekt zurückgegeben, andernfalls ein neues erstellt und mit in den Pool gelegt.

Doch wie du lesen kannst: Einfach so aus dem Boden geschossen kommen die Objekte auch hier nicht. Es geht mehr in die Richtung: Anlegen von Objekten (nach Anstoß) auf versteckte Art und Weise.

Vor der Einführung der StringBuilder-Klasse (also noch vor Java 5) führte der Concat-Operator (+) bspw. dazu, dass implizit ein neues String-Objekt erstellt wurde.

String someName = "John Doe";
System.out.println("Hello " + someName);

Oder seit Einführung des Autoboxing (jeder primitiver Datentyp hat seitdem auch eine Wrapperklasse) sind Ausdrücke wie diese erlaubt:

Character letter = 'a';

Das einzelne Zeichen wird hier automatisch in ein Objekt des Typs Character gestopft, welches neu angelegt wird. Solche Features kannst du dir nicht so einfach selbst schreiben. Sie sind fest in der Java-Sprachsyntax verankert.

Auch bei einem Array gewährt Java syntaktischen Zucker. Es stellt zwar ein Objekt dar, doch bei der Initialisierung reicht trotzdem ein Initializer:

int[] numbers = { 1, 2, 3 };

Der new-Operator muss nicht explizit aufgeführt werden, damit das Array angelegt wird.

Zu guter Letzt könnte man noch raten, dass es sich um Objekte handeln soll, die statisch angelegt werden. Also beim Anlegen der Klasse zu Programmbeginn. Ein Beispiel ist der PrintWriter für System.out. Hier ist es das Schlüsselwort System, welches zuerst aufgelöst werden muss. In diesem Zuge werden also auch die Klasse erstellt und die Initialisierung der statischen Felder findet statt.

So viel fällt mir im Moment zu dem Thema ein.

Objekte unter Verwendung der Java-Bibliothek - Objekte basierend aus eigenen Klassen

Es wäre m.E. passender, von Klassen zu reden, denn die Objekte musst du in jedem Fall erst erzeugen. Egal, ob die Typdefinition nun aus dem SE kommt oder von dir. Einen Unterschied in der praktischen Nutzung gibt es da nicht. Die Ausnahmen, die mir eingefallen sind, habe ich oben bereits angeführt,

Bezüglich des Aussehens fällt mir zunächst die Art der Bezeichner ein. Du kannst davon ausgehen, dass Elemente aus der SE einer weitgehend konsistenten Konvention in englischer Sprache folgen. Zudem sind sie unter Garantie meist besser getestet, als die Klassen, die du schreibst (das ergibt sich schon aus der weiter verbreiteten Nutzung dieser) und es gibt eine Dokumentation. 😜

Da Enumerationen erst später in Java eingeführt wurden, sind konstante Werte als sichtbare, konstante Felder definiert (Beispiel).

Ein weiterer Punkt ist die Implementation. Es gibt in der SE durchaus noch Methoden (wenn auch nur sehr wenige), die auf eine C-Implementation verweisen (schau in die Object-Klasse). Das kannst du natürlich auch tun, aber es ist doch eher unüblich. Ob du es also als Unterschied werten möchtest, kannst du selbst auswürfeln.

Noch ein Unterschied ist natürlich, dass die Typen (Klassen), die in der SE verfügbar sind, für jede Java-Applikation genutzt werden können (wenn auch man vielleicht erst einen Dependency-Verweis vornehmen muss) und alles was sie ausmacht, bereits implementiert ist. Um deine Klassen verfügbar zu machen, musst du erst eine Bibliothek o.ä. anlegen. Um ihnen ein Verhalten und einen Zustand zu geben, musst du sie erst mit dem entsprechenden Code füllen.

(...) und wie spielen sie zusammen?

So wie die Objekte der von dir erstellten Typen miteinander zusammenspielen, so können sie es auch mit denen aus der SE. Die Typen sollten sich nur nicht gegenseitig ausspielen, indem sie gleich benannt und für die gleiche Datei eingebunden werden.

Zudem gibt es einige Gemeinsamkeiten. Alle Klassen erben z.B. von der Klasse Object. Folglich hat jedes Objekt Methoden wie equals, hashCode oder toString zur Verfügung.

Objekte unter Verwendung der Java-Bibliothek ist zum Beispiel einfach nur ein String. Ein String ist ja einfach nur ein String.

Objekte basierend aus eigenen Klassen ist wenn du z.B. eine Human Klasse hast und dann den hier machst: "Human max = new Human("z.B.Alter", "Hobby");

Implizit zur Verfügung stehenden Objekten glaube ich sind Objekte z.B aus einer Library. Wenn du zum Beispiel mit der DiscordAPI arbeitest bietet diese z.B. ein Member Objekt.

Hoffe das war verständlich genug

Woher ich das weiß:Hobby – 4 Jahre Erfahrung im Programmieren in vielen Sprachen
prog6969 
Fragesteller
 31.05.2020, 20:37

Danke <3

0

Es gibt nur zwei Arten von Objekten:

  • Klasseninstanzen
  • Arrays

Primitive Typen wie z.B. int, boolean oder char sind übrigens keine Objekte :)

Kein Objekt steht implizit zur Verfügung. Alle Objekte müssen zuerst erzeugt werden, zum Beispiel:

public class Foo {
    // erzeuge eine Instanz der Klasse Foo:
    public static final Foo FOO_INSTANCE = new Foo();
}

Wo die Klasse eines Objekts definiert ist (in eigenen Klassen oder in einer Bibliothek) spielt keine Rolle.

Woher ich das weiß:Studium / Ausbildung – Informatikstudium