Q:

Concrete class implements an interface which knows the concrete class that implement it

I have tried something, but I'm not sure why it seems to work.
I have an interface and then I have a concrete class.
The interface has a method that uses the concrete class, and that concrete class implements the interface.
Why is this working, if I call the implemented method??
public interface Interface {

    public void greeting(ConcreteClass concreteClass);
}

public class ConcreteClass implements Interface {

    public void greeting(ConcreteClass concreteClass) {

        System.out.println("Hello World!");
    }

}

public static void main (String[] args) {

    ConcreteClass classObject = new ConcreteClass();
    test.Interface interfaceObject = classObject;

    interfaceObject.greeting(classObject);

}

A:

This is precisely what polymorphism is. 
ConcreteClass classObject = new ConcreteClass();
test.Interface interfaceObject = classObject;
interfaceObject.greeting(classObject);

Above code is same as
test.Interface interfaceObject = ConcreteClass();
interfaceObject.greeting(classObject);

Split the code into two parts - compile time and runtime.
At compile time Java compiler sees reference object interfaceObject on which the methods greeting() is called has corresponding method declaration. So it does not complaint.
Now at runtime JVM will know the object is infact an instance of ConcreteClass so will invoke the corresponding method (Given that ConcreteClass correctly implements Interface by providing concrete implementation of greeting() method).
Also there is no restriction on using method argument whose reference type is same as that of the class or interface to which the method belongs.  

