Object-Oriented Programming has 4 core concepts 1- Abstraction - I create a new type of data (class) I write it once and use it a lot 2- Encapsulation - private fields, public get/set methods 3- Inheritance - I hate to write code twice... If I have different types of Employee (Hourly, Salaried, Commissioned, etc) and all of these have: first name last name etc I do not want to write get/set over and over again I create a parent/super/base class and put the common fields and methods there, then my child/derived/sub class inherits all the common fields/methods 4- Polymorphism - I have different implementions of the say method depending on data type, for example all my Employees have a different computePay() method the child class overrides the method from the parent class and at runtime, Java finds the child method (before it looks for a parent method) and runs the first method it finds every Entity class SHOULD override the toString/hashCode/equals method from java.lang.Object this is Polymorphism in action