Well the difference between static and non-static fields is that non-static fields are instance members (which means they have a unique incarnation for each instance of the class you make) whereas static fields are class members, which means that they're always the same for all instances of a class. Static does NOT mean that it stays the same and never changes like mick_rons says - that's the final keyword. For example...
public class Class {
public int non_static_field = 0;
public static int static_field = 0;
public static void main(String[] args) {
Class c1 = new Class();
Class c2 = new Class();
// this changes the non-static field in each instance of Class
c1.non_static_field = 1;
c2.non_static_field = 2;
// this changes the static-field, which is reference via the class of Class, rather than the instance
Class.static_field = 1;
}
As for the second part of your question... Reference types, for example String, are similair to using pointers in C. An array of primitive types, for example int, is an array of fixed size in memory where each location in the array will store an instance of this primitive type. An array of reference types will store a reference do a different location in memory, rather than the actual object itself, and that location denotes where the memory is actually stored.
Hope this helps