Classes in Java are represented by objects of the class Class
,
one object per class.
Consider the following (partial) class:
class Student { String studentName; int studentAge; static int numberOfStudents; } ... Student s1 = new Student(); Student s2 = new Student();
While over-simplified, beginners can think of the fields of a class this way:
non-static fields are per object. In the example above, each of the two
Student
objects has its own set of non-static fields:
studentName
and studentAge
.
So this code will work as expected:
System.out.println( s1.studentAge ); System.out.println( s2.studentAge );
However, the Class
object representing class
Student
has no such fields, so the following code
is illegal:
System.out.println( Student.studentAge ); // won't work
Fields declared as static
are different.
They are part of the Class
object, not the
class' objects.
In this example, the field numberofStudents
is a field of the
obect representing class Student
; the two Student
objects created above have no such field in them.
This is why you can access static
fields this way:
System.out.println( Student.numberOfStudents );
Because of this, non-static fields, which are per object, are called instance variables. Static fields, which are per class, are called class variables.
This is an over-simplification of the actual rules of Java. For example, if the above were true it should be illegal to do this:
System.out.println( s1.numberOfStudents );
But this in fact will work in Java.
There is still only a single field numberOfStudents
no matter how many Student
objects exist.
It is however considered a bad practice do to this.