(General questions about Object Oriented Design): What's the difference between an abstract class and an interface? What's the difference between overriding and overloading? What's the difference between arraylist and array? What are immutable classes? etc