Some general Object Oriented Design principles: 1) When a well designed OO program runs, a collection of objects are created. They are hooked together, and then they cooperate to get a task done. In this way, OO Programming is about letting go of control. If your program has methods that are too busy managing all objects, then it is not considered good OO design. The alternative is letting the objects do what they are supposed to do, getting help from other objects as they need. 2) Where should a method be located? Well one hint includes the following: If the method mentions only class C concepts, then probably the method should be located in class C. 3) The default is instance variables are private, with appropriate public getters and setters defined, as appropriate. Eclipse can help you do this. Example: a getter for instance variable private int capacity; is public int getCapacity(){ return this.capacity; } similarly for setter ... public void setCapacity(int capacity){ ... 4) Choose appropriate methods to make public. They typically take an instance from one consistent state to another. 5) What is the purpose of a class? One answer: To maintain the consistent state of its instance variables, taking them from one consistent state to another. 6) Why should I not allow access to instance variables? Answer: If I want to determine if you are hungry, I ask you. This is a public method. I don't try to inspect your stomach. That would potentially give rise to an upset of the consistent state of the body.