Java Language Membro oggetto vs membro statico


Esempio

Con questa classe:

class ObjectMemberVsStaticMember {

    static int staticCounter = 0;
    int memberCounter = 0;

    void increment() {
        staticCounter ++;
        memberCounter++;
    }
}

il seguente frammento di codice:

final ObjectMemberVsStaticMember o1 = new ObjectMemberVsStaticMember();
final ObjectMemberVsStaticMember o2 = new ObjectMemberVsStaticMember();

o1.increment();

o2.increment();
o2.increment();

System.out.println("o1 static counter " + o1.staticCounter);
System.out.println("o1 member counter " + o1.memberCounter);
System.out.println();

System.out.println("o2 static counter " + o2.staticCounter);
System.out.println("o2 member counter " + o2.memberCounter);
System.out.println();

System.out.println("ObjectMemberVsStaticMember.staticCounter = " + ObjectMemberVsStaticMember.staticCounter);

// the following line does not compile. You need an object
// to access its members
//System.out.println("ObjectMemberVsStaticMember.staticCounter = " + ObjectMemberVsStaticMember.memberCounter);

produce questo risultato:

o1 static counter 3
o1 member counter 1

o2 static counter 3
o2 member counter 2

ObjectMemberVsStaticMember.staticCounter = 3

Nota: non chiamare static membri static sugli oggetti, ma sulle classi. Mentre non fa la differenza per la JVM, i lettori umani lo apprezzeranno.

static membri static fanno parte della classe ed esistono solo una volta per classe. I membri non static esistono sulle istanze, esiste una copia indipendente per ogni istanza. Ciò significa anche che è necessario accedere a un oggetto di quella classe per accedere ai suoi membri.