Dynamic
runtime loading of classes as they are needed
dynamic linking of classes into running system
classes have a run time representation (unlike C or C++) so that given an object you can find out what class it belongs to at run time
interfaces support system's that change
even after binaries have been released, they can adapt to a changing environment
defers decisions (like object layout) to runtime - solves many version problems that C++ has