Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Zunächst wird also eine Referenzvariable vom Typ Instant erstellt und die EPOCH-Konstante zugewiesen - so weit so klar.
In der 2. Codezeile wird mithilfe der plus-Methode des Objekts zeitpkt1 ein zweiter Zeitpunkt erstellt.
Warum ist das aber möglich, es wurde ja gar kein Objekt der Klasse Instant mit dem new-Operator erzeugt?
Verhält sich das evtl. so wie bei der Klasse String, bei der der new-Operator erst implizit vom Compiler erzeugt wird?
Das passiert in der Methode Instant.plus(). Dort kommt es zu weiteren Methodenaufrufen bis das Objekt letztendlich in folgender Methode erzeugt und zurück gegeben wird:
Java:
//-----------------------------------------------------------------------
/**
* Obtains an instance of {@code Instant} using seconds and nanoseconds.
*
* @param seconds the length of the duration in seconds
* @param nanoOfSecond the nano-of-second, from 0 to 999,999,999
* @throws DateTimeException if the instant exceeds the maximum or minimum instant
*/
private static Instant create(long seconds, int nanoOfSecond) {
if ((seconds | nanoOfSecond) == 0) {
return EPOCH;
}
if (seconds < MIN_SECOND || seconds > MAX_SECOND) {
throw new DateTimeException("Instant exceeds minimum or maximum instant");
}
return new Instant(seconds, nanoOfSecond);
}
Das passiert in der Methode Instant.plus(). Dort kommt es zu weiteren Methodenaufrufen bis das Objekt letztendlich in folgender Methode erzeugt und zurück gegeben wird
Das wird erstellt, wenn die JVM den Bytecode für die Klasse Instant lädt:
Java:
class Instant {
public static final Instant EPOCH = new Instant(0, 0);
}
----
P.S.: zeitpunkt1 ist kein Objekt. zeitpunkt1 ist eine Variable, die auf ein Objekt verweist. Ganz genauso ist auch Instant.EPOCH nur eine Variable, die auf ein Objekt verweist.
EPOCH ist eine Konstante der Klasse Instant. Du weist der Variablen zeitpkt1 eine Referenz darauf zu. Hier wird das Objekt erzeugt:
Java:
public final class Instant
implements Temporal, TemporalAdjuster, Comparable<Instant>, Serializable {
/**
* Constant for the 1970-01-01T00:00:00Z epoch instant.
*/
public static final Instant EPOCH = new Instant(0, 0);
. . .
Das Objekt wird bereits beim Laden der Klasse Instant erzeugt und der Konstanten EPOCH eine Referenz darauf zugewiesen. Wenn du in deinem Programm auf EPOCH zugreifst - also erst etwas später - kopierst du diese Referenz in deine Variable zeitpkt1. Das eigentliche Objekt gab es zu dem Zeitpunkt also schon. Es wäre auch erzeugt worden, wenn du gar nicht auf EPOCH zugreifen würdest, sondern die Klasse Instant auf andere Weise genutzt hättest.