Java에서는 메소드와 변수 앞에 static이라는 키워드를 붙일 수 있다. 그렇게 되면 무엇이 달라질까?
클래스 영역 내에 선언된 변수를 멤버변수라고 한다. 멤버변수 중 static이 붙은 것은 클래스변수, 붙지 않은 것은 인스턴스변수라고 한다. 마찬가지로 메소드 앞에 static 키워드가 붙어있으면 클래스메소드, 붙지 않은 것은 인스턴스메소드라고 한다. 클래스변수와 클래스메소드는 클래스 소속, 인스턴스변수와 인스턴스메소드는 인스턴스의 소속이다.
클래스변수와 클래스메소드는 모든 인스턴스가 공통으로 하나를 공유한다. 따라서 한 클래스의 모든 인스턴스들이 공통적인 값 또는 기능을 유지해야하는 경우 사용하게 된다. 클래스변수와 클래스메소드는 인스턴스를 생성하지 않고도 '클래스이름.클래스변수', '클래스이름.클래스메소드'와 같은 형식으로 사용할 수 있다.
반면 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다. 인스턴스마다 고유한 값 또는 기능을 유지해야하는 경우 인스턴스변수와 인스턴스메소드를 사용하는데, 먼저 인스턴스를 생성해야만 사용할 수 있다.

위와 같은 예시가 있다고 하면 instanceVar와 instanceMethod는 인스턴스 소속의 변수와 메소드이므로 Foo를 통해서는 사용할 수 없다. 반면 f1과 f2를 통해 classVar와 classMethod는 사용할 수 있다.
또한, f1에서 instanceVar의 값을 바꿔도 다른 곳에 속한 instanceVar의 값에는 아무 영향을 주지 않는다. 그러나, f1에서 classVar의 값을 바꾸는 경우 Foo의 classVar, f2의 classVar 값이 모두 동일하게 바뀌게 된다.