Abstraction refers to the set of concepts that some entity provides for achieving a task or solve a problem (e.g., the public methods of Java's String class). Abstraction is the **most important concern** in [[object oriented programming]]. Abstraction is often accomplished early in the software engineering process during conceptual design. Abstraction answers the questions - how will users think about using what I develop? - what mental model do I want to provide for them? - What level of detail is needed? - What responsibilities will classes in the design have? - What will the connections be between elements, and which methods will be exposed? [[Encapsulation]] supports abstraction, but abstraction is more than just encapsulation.