So was ProgrammerInterview wrong?
No. È corretto.
Dice:
"But now we can see that out
must be an instance of a class ..."
Questo non significa che out
sia una variabile di istanza. Una variabile di istanza è una variabile che appartiene a un'istanza, NON una variabile che contiene (si riferisce a) un'istanza.
Tuttavia, penso che ci sia un difetto nella logica di questa affermazione:
But now we can see that ‘out’ must be an instance of a class, because it is invoking the method ‘println()’.
... quando ci si riferisce a questo:
System.out.println();
Ho letto questo come dicendo che System.out.println()
è la sintassi per invocare un metodo di istanza, e quindi il valore di System.out
deve essere un'istanza di qualche classe.
È vero che System.out
fa riferimento a un'istanza e println()
è in effetti un metodo di istanza. Ma questo non segue logicamente dalla sintassi.
Perché? Perché è possibile utilizzare la stessa sintassi esatta per richiamare un metodo static
. (Questo è specificato in JLS 15.12 ... ma è una lettura lunga e complicata.)
Esempio:
public class Test {
private static void jello() {
System.out.println("jello world");
}
public static void main(String[] args) {
// The preferred way to invoke a static method
Test.jello();
// This also works ...
Test test = new Test();
test.jello();
}
}
Pertanto, non possiamo dedurre dalla sintassi utilizzata che viene invocato un metodo di istanza.