When I started using an object-oriented language (Java), I pretty much just went "Cool" and started coding. I've never really thought about it until only recently after having read lots of questions about OOP. The general impression I get is that people struggle with it. Since I haven't thought of it as hard, and I wouldn't say I'm any genius, I'm thinking that I must have missed something or misunderstood it.

Why is OOP difficult to understand? Is it difficult to understand?

I personally found the mechanics of OOP fairly easy to grasp.  The hard part for me was the "why" of it.  When I was first exposed to it, it seemed like a solution in search of a problem.  Here are a few reasons why I think most people find it hard:


IMHO teaching OO from the beginning is a terrible idea.  Procedural coding is not a "bad habit" and is the right tool for some jobs.  Individual methods in an OO program tend to be pretty procedural looking anyhow.  Furthermore, before learning procedural programming well enough for its limitations to become visible, OO doesn't seem very useful to the student.
Before you can really grasp OO, you need to know the basics of data structures and late binding/higher order functions.  It's hard to grok polymorphism (which is basically passing around a pointer to data and a bunch of functions that operate on the data) if you don't even understand the concepts of structuring data instead of just using primitives and passing around higher order functions/pointers to functions.
Design patterns should be taught as something fundamental to OO, not something more advanced.  Design patterns help you to see the forest through the trees and give relatively concrete examples of where OO can simplify real problems, and you're going to want to learn them eventually anyhow.  Furthermore, once you really get OO, most design patterns become obvious in hindsight.

