"Ferrari extends Engine - Ferrari is a Engine - does not make sense but ferrair has a Engine so Ferrari would be a instance variable of Engine?"
Ferrari has an Engine, so Ferrari would implement the Engine interface.
Implementing an interface is a type of "is-a" relation, not "has-a." So an Engine would be an instance variable of a Ferrari.
Now, back to the OP---
When you extend/implement a superclass/interface, you are narrowing the possibilities. I like to think of it in terms of Linnean Taxonomy:
Note that each extension adds a level of specificality. We could go in and fill in more and more details at each level (attributes, like "spinalCord" at the "Chordata" level, and methods, like "giveBirthToLiveYoung()" at the "Mammalia" level), until finally we've gotten specific enough that we can accurately describe an ocelot.
Piscis Babelis est parvus, flavus, et hiridicus, et est probabiliter insolitissima raritas in toto mundo.