Der Effekt der Deklaration einer lokalen Variablen ohne Initialisierung wie etwa bei `String a;` ist undefiniert. Es ist also nicht definiert, ob `a` jetzt nun als Inhalt die Nullreferenz hat oder nicht.
Du kannst z.B. eine solche deklarierte Variable nicht lesen, sondern sie muss zuvor erst gesichert zugewiesen sein, z.B. durch `a = null;` oder eben gleich bei der Deklaration.
Das geht so weit, dass du dir den Wert einer uninitialisierten Variable noch nicht mal im Debugger angucken kannst.
Desweiteren erkennt man auch nicht, ob das jetzt Deklarationen von lokalen Variablen sein sollen oder vielleicht Felder/Instanzvariablen einer Klasse.
Nehmen wir mal lokale Variablen an.
In diesem Fall:
"Im Stack ist a, ab und mensch1" -> Korrekt. (siehe JVMS 2.5.2 "Java Virtual Machine Stacks")
"a zeigt auf null in den Heap" -> Nein. Es ist nicht definiert, worauf `a` zeigt, oder ob es überhaupt existiert.
"ab speichert die Referenz von einem Objekt, das das Wort "Peter" enthält" -> Korrekt. Genauer speichert `a` die Referenz auf ein java.lang.String Objekt, welches den Text "Peter" repräsentiert.
"mensch1 speichert die Referenz eines Objekts des Typs Mensch im Heap." -> Korrekt.
Bezüglich Stack und Heap, weil es hier wiederum Mehrdeutigkeiten gibt, was genau damit gemeint sein kann:
Im Kontext der Java Virtual Machine Specification ist hier von dem JVM Stack und dem JVM Heap die Rede. Die JVM ist eine virtuelle Maschine, hat also erstmal überhaupt keine Äquivalenz zu einem realen Stack oder Heap einer realen Maschine.
Wenn man nun aber die virtuelle Maschine auf einer realen Maschine implementiert, dann macht man das natürlich so, dass die von der realen Maschine angebotenen Dinge wie der virtuelle Speicher (in Stack und Heap aufgeteilt) auch möglichst 1-zu-1 auf den JVM Stack und JVM Heap abgebildet werden. Zusätzlich kommen dann noch weitere Optimierungen, z. B. dass man Teile des JVM Heaps auf den Stackbereich der realen Maschine abbildet oder sogar auf Register (sofern die reale Maschine diese besitzt).
Das heißt, streng genommen wenn du im Zusammenhang mit Java oder der Java Virtual Machine von "Stack" oder "Heap" hörst, dann ist damit nicht der Hardware-Stack oder Heap einer realen Maschine (auf der die virtuelle Maschine implementiert ist) gemeint, wie etwa einem x86 Rechner, sondern es handelt sich dabei meist um den JVM Stack bzw. Heap der virtuellen Maschine. Und diese virtuelle Maschine kann dann natürlich auf beliebigen realen Maschinen, wie etwa einem BlueRay-Player oder eben einem x86, ARM oder PPC implementiert werden.