Hay demasiada información sobre los objetos. Lo más importante es dominar los conceptos básicos y todo encaja más fácilmente.
He aquí una forma de pensar en los objetos. Piense en estructuras de datos en lenguajes de procedimiento. Son un grupo de campos sin comportamiento. Piense en funciones que reciben punteros a esas estructuras de datos y manipulan estas últimas. Ahora, en lugar de separarlas, defina las funciones dentro de la definición de las estructuras y asuma que las funciones generalmente reciben un puntero a la estructura de datos para manipular. Ese puntero se llama así. En resumen, piense en los objetos como la combinación de estado (datos) y comportamiento (métodos, el nombre elegante de las funciones en OOP).
Este es el básico absoluto. Hay tres conceptos más que debes dominar absolutamente:
Herencia: se trata de reutilizar el código.
Encapsulación: se trata de ocultar la implementación de la interfaz. En pocas palabras, todo debe ser privado hasta que se demuestre lo contrario.
Polimorfismo: no importa el tipo de variable de referencia, sino el tipo de instancia real para saber qué comportamiento (método) se llama. Java no facilita que este concepto sea muy visible porque, por definición, todo es polimórfico. .Net hace que sea más fácil de entender a medida que decide qué es polimórfico y qué no, por lo que se nota la diferencia en el comportamiento. Esto se logra mediante la combinación de virtual y override.
Si estos conceptos se entienden muy bien, estará bien.
Un último consejo final: mencionas los mejores libros. ¿Ha leído " Pensando en Java " de Bruce Eckel? Recomiendo este libro incluso a las personas que se inician en .Net, ya que los conceptos de programación orientada a objetos están claramente establecidos.