Warum kein new ?

johnkramer

Neues Mitglied
Hallo,
ich bin ein neuling bei der Java-Programmierung. Arbeite gerade mit dem Buch Java 6 von Dirk Louis und Peter Müller. Es gibt dort einen Sachverhalt, den ich noch nicht verstehe, weil er nicht umfangreich erklärt ist oder weil ich die Erklärung schlicht nicht verstehe...

Es geht um das Schlüsselwort new , welches manchmal nicht verwendet wird.

Häufig sind das Codes wie diese...

Java:
Console cons =  System.console();
cons.printf("...");

Es soll hier ein Objekt der Klasse Console erzeugt werden, um Schreibarbeit zu sparen, also wegen (System.console().printf(); )
Hierbei wird das new jedoch weggelassen, also kein "Console cons = new System.console();"
und ich frage mich warum das so ist, wo doch alle Instanzen mit new erzeugt werden müssen bei der ooP.
 

Timothy Truckle

Top Contributor
Es soll hier ein Objekt der Klasse Console erzeugt werden,
Nicht ganz: es soll eine Referenz auf ein Objekt vom Typ [JAPI]Console[/JAPI] erzeugt werden. Die Erzeugen des Objekts selbst fand in der Klasse [JAPI]System[/JAPI] statt. Mit
Code:
System.console()
wird die statische Methode
Code:
console()
in der Klasse [JAPI]System[/JAPI] aufgerufen, die ein (vorher intern mit new erzeugtes) Objekt zurükgibt.

bye
TT
 

johnkramer

Neues Mitglied
Ok klingt schon mal einleuchtend.

Wocher weiß ich dass es hiebei ausreicht eine Referenz herzustellen bzw. dass das Object schon erzeugt wurde/wird?

Ich hab hier kurz in der java Referenz nachgeschlagen... in der System Klasse:

public static Console console()

Returns the unique Console object associated with the current Java virtual machine, if any.

Returns:
The system console, if any, otherwise null.
Since:
1.6

Das roteingefärbte ist wohl das entscheidende. Heißt das ich muss immer vorab wissen dass das Object vorher ezeugt wird? Oder gibt es da irgendeinen Trick, wie man erkennen kann, wann man eine Objekt selber erzeugt und wann nicht.
 

DrZoidberg

Top Contributor
Ich würde sagen das hier ist das entscheidende.
Java:
public static Console console()

Da steht, dass console() eine Methode ist, die ein Object vom Typ Console zurückliefert. Wenn du eine Methode aufrufst, musst du nie new verwenden. new wird nur beim Aufruf eines Konstruktors verwendet. Also mit anderen Worten, hinter new steht immer ein Klassenname, aber niemals ein Methodenaufruf.
 

Timothy Truckle

Top Contributor
Das roteingefärbte ist wohl das entscheidende. Heißt das ich muss immer vorab wissen dass das Object vorher ezeugt wird? Oder gibt es da irgendeinen Trick, wie man erkennen kann, wann man eine Objekt selber erzeugt und wann nicht.
Bei Bibliotheksklassen stehts in der API, wie Du ja schon gemerkt hast.

Bei eigenen Klassen gilt: grundsätzlich muss ich davon ausgehen, das ich selbst ein neues Objekt erstellen muss. Ich kann dies aber (wie bei System.console()) in eine "Service-Methode" auslagern. Das hat mehrere Vorteile:
- ich kann allen Programmteilen das selbe Objekt geben (es gibt also nur ein einziges Objekt im gesamten Programm, wie im Beispiel)
- ich kann eine abgeleitete Klasse zurück geben, ohne dass ich die Programmstellen, die dieses Objekt verwenden ändern muss.

bye
TT
 

Network

Top Contributor
Um die eigentlich von Timothy Truckle bereits ausreichend geschilderte Situation nochmals näher zu beschreiben:
Die Klasse "System" unterliegt nicht dem klassischen Prinzip der OO. Es handelt sich hierbei um eine statische Klasse. Dabei handelt es sich um eine Klasse die nicht durch das objektorientierte System beeinflusst/beeinschränkt wird.

Das hat jedoch den Nachteil der von dir beschriebenen Verwirrung sowie das von dieser Klasse nur eine einzige Instanz existieren kann. Jedoch mit dem Vorteil das von überall aus darauf zugegriffen werden kann.

Erkennen ob du die jeweilige Methode mit dem Klassennamen aufrufen kannst oder ein neues Objekt erstellen musst, kannst du daran erkennen ob die Methode das Stichwort "static" beinhaltet.
Statische Methoden können auch direkt aufgerufen vom jeweiligen Objekt
Java:
System system = new System();
system.console();
Der Compiler kreidet dass dann als Warnung an, deine IDE wird dich also darauf hinweisen dass es eine static-Methode ist, das Programm läuft aber trotzdem.

Viele Neulinge kommen an dieser Stelle auf die Idee, dass das doch recht praktisch ist -> Das ist echt fies von den Entwicklern der JavaLib denn die sind nicht immer gerade ein gutes Vorbild.
Also komme nicht auf die Idee ab sofort static zu verwenden. Vergiss es am besten ganz schnell wieder.

Gruß
Net
 
Zuletzt bearbeitet:
I

Ick2222

Gast
Hallo,

um Deine Verwirrung mal zu komplettieren, muss ich Network widersprechen. Deine eigentliche Frage, wann Du ein new benötigst und wann nicht hat nicht direkt etwas mit statischen Methoden zu tun.

Erstmal vorweg, es ist nicht falsch, auf statische Methoden kannst Du immer zugreifen, ganz ohne je ein new Aufgerufen zu haben. Aber das ist nur die berühmte halbe Wahrheit (oder 21).

Es gibt mindestens vier verschiedene Gründe, wann Du keinen new-Operator aufrufen musst:
  1. Primitive Datentypen
  2. Statische Methoden
  3. Strings
  4. Extern erzeugte Referenzen

Primitive Datentypen hast Du bestimmt schon kennengelernt (fangen immer mit einem Kleinbuchstaben an), gehe ich hier nicht näher drauf ein.

Die statischen Methoden wurden bereits ausgeführt und hier gilt es wirklich, dass man wissen sollte wann man die verwendet. Sonst sind die einfach unsauber und führen zu miserablen Code, der auf die Vorteil der Objekt Orientierung verzichtet.

Strings sind etwas ganz besonder Hässliches in Java - und vielen anderen Sprachen. Um den Komfort zu erhöhen werden hier statische Konstruktoren verwendet, schreibst Du
Code:
"Ein String"
wird intern dafür gesorgt, dass hier ein Objekt vom Typ String verwaltet wird. Du könntest zwar auch
Code:
new String("Ein String")
schreiben, dies wäre aber alles andere als guter Stil, da hier zwei mal für ein neues Objekt gesorgt wird. Wie gesagt, eine einzige Ausnahme und deshalb nur der Vollständigkeit wegen erwähnt.

Das andere (ob statisch oder nicht) sind Methoden, die Dir eine Referenz zurückgeben. Jede Methode hat immer einen Rückgabewert. Bei void ist dieser quasi leer und wird nicht weiter berücksichtigt, aber sonst steht da ja immer der Datentyp, den die Methode zurück gibt.
Hierfür gibt es verschiedene Gründe, zum Beispiel kann es sein dass Du etwas berechnen möchtest, das einen komplexen Datentypen hat. Sagen wir mal, Du möchtest mit Punkten rechnen, die eine X und Y Komponente haben. Der Datentyp sieht vielleicht so aus:
Code:
public class Coordinate {
  private int x;
  private int y;

  public Coordinate(int x, int y) {
    this.x = x;
    this.y = y;
  }

  // ... Getter und Setter
}

Möchtest Du jetzt Koordinaten addieren oder Ähnliches, dann kann es sein dass eine Methode dazu einfach ein neues Objekt erzeugt und dieses zurück gibt:
Code:
public Coordinate add(Coordinate first, Coordinate second) {
  // Summe der Koordinaten berechnen
  int resultX = first.getX() + second.getX();
  int resultY = first.getY() + second.getY();

  // Neues Objekt erzeugen, in welche das Ergebnis geschrieben wird
  Coordinate result = new Coordinate(resultX, resultY);
  return result;
}

Hier würdest Du vor dem Aufrufer das "new" verbergen. Der Aufrufer der Methode bekommt einfach eine Referenz auf ein (neu erzeugtes) Objekt.
Ganz typische Fälle sind eben solche Berechnungen, die ein Objekt erzeugen. Es gibt aber Caches und Pools, das heißt hier werden mehrere Objekte verwaltet und wiederverwendet (ein komplexes Thema, weshalb man hier einfach fertige Lösungen verwendet). Hier werden Objekte einfach "auf Vorrat" angelegt und immer wenn eins benötigt wird, sucht man ein aktuell freies und gibt dieses zurück. Das sparrt dann die Zeit, die die Objekterzeugung (eben der Aufruf von new) benötigt. Hier kannst Du Dir einfach vorstellen, dass der Speicher schon reserviert wurde, genau das entfällt entsprechend.
 
T

tröööt

Gast
@TO
um auf die frage "warum kein new?" direkt und ohne weitere verwirrungen zu antworten : weil du bei "System.console()" eben KEIN neues objekt erzeugst sondern dir nur eine referenz auf ein bereits bestehendes objekt

sowas nennt man "statische utility methoden" ... und das sind eigentlich fast alle klassen in java.lang ...

du hast also eine klasse ... z.b. System ... und diese bitet dir statische methoden an ... z.b. console() ... die dir eine referenz auf ein objekt eines bestimmten types zurückgeben ...


NEW wird NUR verwendet wenn du auch wirklich explizit ein neues objekt über einen konstruktor erzeugen willst ... also "new Object()" oder "new ArrayList<Set<Class<?>>>()" ...
 

Bleiglanz

Gesperrter Benutzer
Ein Aspekt wurde noch vergessen (ist für Anfänger vielleicht wichtig):

Es gibt keine "Regel" wann ein Objekt mit new erzeugt werden muss oder ob unter Umständen eine sogenannte statische Factory-Methode eine Referenz auf ein Objekt zurückliefert. Hängt von der verwendeten Bibliothek, den Umständen und den Sackläusen den zuständigen Entwicklers ab.

Die Console ist insofern ein Spezialfall, weil sie ein "eindeutiges, einmaliges" Ding repräsentieret (das kleine schwarze Bildschirmfenster, in dem man mit java Klassenname ein Programm starten kann). Es würde ziemliches Chaos anrichten, wenn die Programmierer mit new immer neue solche Konsolen erzeugen könnten - deshalb haben sich die Programmierer bei Sun damals entschlossen, diese über System.console() verfügbar zu machen.
 

Landei

Top Contributor
Es sollte noch erwähnt werden, dass es Möglichkeiten gibt, Objekte zu erzeugen, ohne [c]new[/c] aufzurufen:
  1. Reflection (etwa [c]myClass.newInstance()[/c])
  2. [c]Object.clone()[/c], wenn das [c]Cloneable[/c]-Interface implementiert wird
  3. Deserialisierung, wenn [c]Serializable[/c] implementiert wird
  4. Enum-Instanzen (wie schon erwähnt)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jul1n4tor Scanner error bei Eingabe die kein Integer ist Java Basics - Anfänger-Themen 4
M intelliJ auf neuem PC, plötzlich kein Code Java Basics - Anfänger-Themen 3
K Schleife berechnet kein Ergebnis (Vererbung) Java Basics - Anfänger-Themen 6
C Kein Zugriff auf Klassenmethoden in Main Methode Java Basics - Anfänger-Themen 23
Nina Pohl Ein Vorgang bezog sich auf ein Objekt, das kein Socket ist Java Basics - Anfänger-Themen 6
M Kein Shortcut? Java Basics - Anfänger-Themen 7
moiss002 Umgebungsvariable Kein Zugriff auf ein Array Java Basics - Anfänger-Themen 7
GermanPie Fehler in Putty (kein Hauptmanifestattribut, in jar) Java Basics - Anfänger-Themen 4
Z Kein überprüfen des gesamten Arrays möglich.(Viergewinnt Spiel) Java Basics - Anfänger-Themen 6
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
B Warum bekomme ich kein Bild. Java Basics - Anfänger-Themen 10
D kein hauptmanifestattribut in dateiname.jar Java Basics - Anfänger-Themen 14
X Methode bei mehrfachen Aufruf kein Effekt Java Basics - Anfänger-Themen 3
Z Warum kein Dreieck aus Sternen? Java Basics - Anfänger-Themen 9
T In C:\java\bin wird kein javac angezeigt. Java Basics - Anfänger-Themen 1
B Wieso gibt das Programm in der Console kein Ergebnis aus? Java Basics - Anfänger-Themen 2
N kein Sound beim Öffnen der jar-Datei, in Eclipse schon Java Basics - Anfänger-Themen 1
I Shutdown wenn kein Strom verfügbar Java Basics - Anfänger-Themen 4
K Interface Kein Bild im .jar-File Java Basics - Anfänger-Themen 15
X Best Practice SUCHE ein gutes Javabuch! (kein Anfang von 0) Java Basics - Anfänger-Themen 5
N Input/Output Wenn kein Input, dann Fehler anzeigen lassen im JFrame Java Basics - Anfänger-Themen 6
H Kein Zugriff auf das Element einer JList möglich: Fehlermeldung Java Basics - Anfänger-Themen 2
J Umgebungsvariable Programmfenster zeigt kein Bild an Java Basics - Anfänger-Themen 1
T Objektorientierte Programmierung - Kein Plan wieso das nicht funktioniert! Java Basics - Anfänger-Themen 6
B Compiler-Fehler 86:11: error: ';' expected obwohl kein ";" hingehört! Java Basics - Anfänger-Themen 10
T Compiler-Fehler Methode ist Abstrakt obwohl kein Schlüsselwort gesetzt wurde Java Basics - Anfänger-Themen 5
V Kann kein Java Projekt mehr mit Eclipse erstellen Java Basics - Anfänger-Themen 5
Joew0815 Methoden Objekt als Methoden-Parameter - Kein call-by-reference? Java Basics - Anfänger-Themen 12
D Kein Zugriff auf JFrame Java Basics - Anfänger-Themen 2
C Klassen Wieso kein infiniter Regress? Java Basics - Anfänger-Themen 4
N Kein Zugriff auf Ordner -> NullPointerException Java Basics - Anfänger-Themen 2
I kein zugriff auf jList oder Textfield Java Basics - Anfänger-Themen 2
X Fehler beim Öffnen von Jar Datei: "kein Hauptmanifestattribut" Java Basics - Anfänger-Themen 5
D Classpath Kein Zugriff Java Basics - Anfänger-Themen 9
Xendarii Quicksort gibt kein Ergebnis aus Java Basics - Anfänger-Themen 13
K Warum ist ein Singleton kein Best Practise? Java Basics - Anfänger-Themen 3
J ResultSet.getStrin - doch kein String? oder wo liegt das Problem? Java Basics - Anfänger-Themen 3
Kenan89 JScrollPane, aber kein Scrollbalken Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
M In Netbeans kein Problem, im Terminal schon Java Basics - Anfänger-Themen 3
E Kein Rechtzeitiger Abbruch bei Rekursiverfunktion Java Basics - Anfänger-Themen 8
C Stringeingabe: kein Satz wegen Leerzeichen möglich Java Basics - Anfänger-Themen 3
I Warum kein this in Methode Java Basics - Anfänger-Themen 17
V Kein neuer Thread trotz Runnable Java Basics - Anfänger-Themen 4
H Erste Schritte Kein Zugriff auf einen button der ein Ereignis ausgelöst hat Java Basics - Anfänger-Themen 2
M Kann kein Objekt (AudioFile in diesem Beispiel) für ein leeren String erzeugen Java Basics - Anfänger-Themen 3
K SWT Fehler obwohl kein SWT benutzt wird Java Basics - Anfänger-Themen 4
L String: Objekt und doch kein Objekt? Java Basics - Anfänger-Themen 5
J Warum kein return wert? Java Basics - Anfänger-Themen 10
S kein sound? Java Basics - Anfänger-Themen 3
T JTextPane - setText kein kein neuladen der Bilder? Java Basics - Anfänger-Themen 8
L Kein System.out Java Basics - Anfänger-Themen 14
T Warum öffnet sich kein Fenster? Java Basics - Anfänger-Themen 3
c_sidi90 jTextarea kein Zeilenumbruch erlauben Java Basics - Anfänger-Themen 4
M Kein Sound in der .jar, davor schon Java Basics - Anfänger-Themen 6
alderwaran closed source jar, kein javadoc. was macht methode x eigentlich? ( oracle forms pjc beans ) Java Basics - Anfänger-Themen 2
K Arrays - Komma zu viel, kein Problem? Java Basics - Anfänger-Themen 3
G erweiterte for schleife kein new? Java Basics - Anfänger-Themen 4
I Kein Zugriff auf erstelltes Objekt aus anderer Methode Java Basics - Anfänger-Themen 6
C warum liefert equals kein TRUE Java Basics - Anfänger-Themen 12
T meinThread.wait(); wirft immer Exeption & hat kein Effekt Java Basics - Anfänger-Themen 15
Houly kein bild im JFrame bei Mp3 Wiedergabe Java Basics - Anfänger-Themen 5
T Jar-Archive kein System.out.println()?? Java Basics - Anfänger-Themen 5
W "Kein korrekter Schleifendurchlauf" Java Basics - Anfänger-Themen 3
S Kein Event bei Click auf JComboBox Java Basics - Anfänger-Themen 4
radiac Wieso bekomme ich kein Bild drauf??? Java Basics - Anfänger-Themen 13
W peinliches Problem - Kein Konstruktor? Java Basics - Anfänger-Themen 10
Spot84 kein interface iEditorInput Java Basics - Anfänger-Themen 2
Kasoki Compilen von Java Scripts (Nein kein JavaScript xD) Java Basics - Anfänger-Themen 13
G Logger mag kein Linux Java Basics - Anfänger-Themen 3
M erzugt kein objekt Java Basics - Anfänger-Themen 18
L Kein Zugriff auf Listen in einem Array Java Basics - Anfänger-Themen 2
G GUI von wiederholender Methode füttern; kein Programmende Java Basics - Anfänger-Themen 2
K kein Sound beim Öffnen der jar-Datei, in Eclipse schon Java Basics - Anfänger-Themen 2
P Eclipse startet kein Applet Java Basics - Anfänger-Themen 6
G Kein EJB-Package vorhanden Java Basics - Anfänger-Themen 2
A kein zugriff auf variable trotz public? Java Basics - Anfänger-Themen 3
F Seltsame Zeichen und kein Zeichenumbruch mit Filewriter Java Basics - Anfänger-Themen 4
S Kein Zugriff auf Files in Jar-Datei Java Basics - Anfänger-Themen 4
C Kann kein Java Programm starten Java Basics - Anfänger-Themen 8
G Auf Bildschirm (kein Fenster) schreiben Java Basics - Anfänger-Themen 2
G kein Zugriff auf eine Klasse in einem Unterordner Java Basics - Anfänger-Themen 11
M Prüfen, ob Tag im Jahr kein Samstag/Sonntag ist Java Basics - Anfänger-Themen 7
G kein text im dialogfeld Java Basics - Anfänger-Themen 3
K JavaKara Programm - erfolgreich compiliert jedoch kein Start Java Basics - Anfänger-Themen 12
M SystemTray zeigt kein Icon an Java Basics - Anfänger-Themen 11
L Warum öffnet sich aus einer .jar-Datei kein Dosfenster? Java Basics - Anfänger-Themen 5
G Listen, über Listen. und doch kein Überblick Java Basics - Anfänger-Themen 8
I translate.java - kein sichtbarer fehler im quelltext Java Basics - Anfänger-Themen 18
S Kein wirklicher Ansatz Java Basics - Anfänger-Themen 6
F Kann kein Programm über die Konsole ausführen Java Basics - Anfänger-Themen 5
G Habe bei String kein split()? Java Basics - Anfänger-Themen 7
G Kein Runden Java Basics - Anfänger-Themen 3
G readln, aber kein writeln :( Java Basics - Anfänger-Themen 12
G Kein main Type? Java Basics - Anfänger-Themen 3
R Klasse nicht sichtbar(kein private-Fehler) Java Basics - Anfänger-Themen 2
H kein lösungs ansatz mit java Java Basics - Anfänger-Themen 4
S Layout Probleme (Kein Adden möglich) Java Basics - Anfänger-Themen 18
M JSP: Cookies setzen ist kein Problem, aber wieder ändern ??? Java Basics - Anfänger-Themen 3
W mehrere Strings vergleichen, (kein equal-Problem) Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben