This week's book giveaway is in the OO, Patterns, UML and Refactoring forum. We're giving away four copies of Refactoring for Software Design Smells: Managing Technical Debt and have Girish Suryanarayana, Ganesh Samarthyam & Tushar Sharma on-line! See this thread for details.
Abstract classes can't be instantiated(you can't create objects of their type), but they can be subclassed. Which means that another class could inherit all of its methods and attributes; whether those methods are abstract or not is up to the designer.
Example: Assume Java doesn't actually have a Math class
The PI constant in the shape class can be used by the Circle class. This is a poor example because Java provides a Math class that holds constants like PI.
You could have yes. But in this case Shape was abstract because you wouldn't just want to create a generic Shape object. You wouldnt know how to find the volume of a "Shape", or its circumference, etc..