I think the main reason what people get wrong about OOP is that they tend to think everything needs to be models with inheritence, which is completely wrong. Inheritence is BAD!
The rule should be:
1. Avoid inheritance
2. Use interfaces instead
3. If interfaces are not enough, use composition
4. If composition is not enough go through all other similar design patterns that are not based on inheritance.
5. If you really need inheritance, be very careful about which function you make non-final and non-private.