Interface is a protocol for implementors and users. So it can be used to implement callback function which is wildly used in many other areas. The interface is much more powerful than class or abstract class. Interfaces can be inherited and extended. A class can inherit multiple interfaces.
Inner class gives us convenience to have more than one implementation of an interface in a class. This is pretty useful in some cases when you need to have multiple implementation of some interface or callback. Event handlers in GUI, for instance, take a lot advantage of anonymous class. That is also the place in which we use inner class most.
Although they provide use more options and more powerful solutions, interfaces and inner class should be considered in design phase. Inappropriate usage of them could cause serious problems in implementation phase and maintenance phase. We should learn when and where to use, rather than how to use them. Also, we should learn to use them to improve our solutions not causing new problems.