Some folks claim to know object-oriented programming. I'd confirm this when job-interviewing them. I'd ask something like: Suppose you're writing a system to organize a kitchen. You already know you'll need object classes for: Kitchens, Cupboards, Bowls, Plates. What would the relation between this object class and that object class be? About half of these folks would say that Cupboard was a superclass of Bowl. While aiming for the notion that a cupboard can contain some bowls, they instead came up with the notion that bowls are a kind of cupboard.
I'd chuckle ruefully: It made sense that folks who had cram-learned Java or C++ would make this mistake. They'd probably spent a whole day learning some language's complex rules of type inheritance. You spend that much time learning about something, you think you're probably supposed to use it all the time.
So I've been catching up on Java's new features, for a very loose definition of "new". Java's picked up more type inheritance complexity since I learned it. (Especially if you say that interface/implements is basically more type inheritance, which I do. And then you get into covariance and contravariance and all those whatevervariances that I theoretically learned for Scala but still have to Google every time to remember which is which…) Those kids had so much education tricking them into thinking that bowls are cupboards. Much more than I realized. I thought I was being cruel-but-fair. It turns out, I was being more extra-cruel-but-fair.