Una variabile deve contenere un'istanza di una classe se richiama un metodo?

1

Nel seguente link , l'autore dichiara che

We have already reasoned that ‘out’ is a static variable belonging to the class System. But now we can see that ‘out’ must be an instance of a class, because it is invoking the method ‘println()’.

Ma come può una variabile di classe, ad esempio la variabile statica, essere anche una variabile di istanza? Dichiara che è un'istanza di una classe, che è vera - senza la classe, out cessa di esistere. Ma non è una variabile di istanza perché c'è solo un out per ogni istanza di System oggetti. (Nota che System possiede costruttori privati.)

Quindi ProgrammerInterview era sbagliato?

    
posta Jossie Calderon 12.06.2016 - 07:07
fonte

4 risposte

6

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.

    
risposta data 12.06.2016 - 07:10
fonte
2

But now we can see that ‘out’ must be an instance of a class, because it is invoking the method ‘println()’.

La tua confusione deriva dal fatto che questa frase è un po 'imprecisa (non è sbagliata, è solo un linguaggio sciatto). Più preciso sarebbe:

But now we can see that ‘out’ must contain a reference to an instance of a class

(e la classe che si intende qui è PrintStream , non System ).

    
risposta data 12.06.2016 - 10:07
fonte
0

L'autore non ha torto, poiché esiste una differenza tra un'istanza dell'oggetto e una variabile di istanza, come delineato nell'altra risposta.

Tuttavia, l'autore ha torto su come si determini che out sia una variabile di istanza. L'autore scrive:

In Java, the dot operator can only be used to call methods and variables so we know that ‘out’ must be either a method or a variable...

Ma ecco un rapido esempio di contatore per mostrare che non è così facile, dove il mio out è una classe.

public class JavaTest
{
    public static void main (String[] args)
    {
        Mysystem.out.println("Hello world");
    }

    static class Mysystem 
    {
        static class out
        {
            static void println(String s)
            {
                System.out.println(s);
            }
        }
    }
}
    
risposta data 12.06.2016 - 08:38
fonte
0

Le altre risposte riguardano la correttezza del testo dell'articolo. Ma potresti essere stato confuso, perché l'intestazione della sezione dell'articolo non è corretta. Nella sezione Che cos'è "out" in System.out.println ()? , determinano che out non è una variabile di istanza. La prossima sezione è intitolata È "out" in System.out.println () una variabile di istanza? Ma hanno appena risposto! Non c'è bisogno di chiedere di nuovo. E non mettono in discussione questo in questa sezione. Invece, questa sezione esamina se out è "un'istanza di una classe". Questo fa sembrare che "variabile di istanza" significhi la stessa cosa di "istanza di una classe", perché ne hanno scritta una quando intendevano l'altra. Ma è un errore di battitura, non un sinonimo. Probabilmente intendevano intitolare quella sezione È "fuori" in System.out.println () un'istanza?

    
risposta data 12.06.2016 - 15:39
fonte

Leggi altre domande sui tag