Explain the difference between abstract classes and interfaces in Java, and when would you choose one over the other?