overriding would be used to change how a sub-class implements an inherited behaviour, you do this when you implement (override) toString() to change what the object will "print" when its toString is called. Same for hashCode so you can define how an object will calculate its hashValue, and equals to determine how one object determines its equality with another.
overloading is simply to provide several to call the same method but with different paremters, often used with Constructors. Say you had a method to compute the fibonarcci (spelling?) sequence, you could provide a method that defines what number to start computing at called compute(int start) and a second that also allows you to define how many iterations you wish to compute, compute(int start, int interations).
This might look like:
Interface can be used to define a behaviour that cuts across several inheritance trees, so rather then all objects that need to Bounce inheriting from a single Bounce object, they could implement a Bounce interface and inherit from their natural parent object.
They can be used to define a contract/API, client classes work to the API rather then work to a given implementation.
Am sure there or other reasons, and vastly better explenations (mostly spelt better too

)
Its probably worth checking out something like the Head First
Java book or a book on Java certification.
Hope that helps
G
[ June 18, 2007: Message edited by: Gavin Tranter ]