You can have the same kind of separation between definition and implementation in Java. We do it all the time in our development work through Interface Driven Design. We design the entire system as a set of interfaces that represent behavior and functionality in the system. Once the interfaces are defined, we create implementing classes that realize the behavior defined by the interfaces.
This gives us the ability to refer to our components by there interfaces and the flexibility to replace particular implementations without having to modify the references throughout the code base.
The one caveat about such a design method is the need to do dependency injection to maintain the separation between types. The dependency injection can be done either manually, or, as most people do it, using a DI framework such as the one included in Spring.