Thinking that each OO (and really, Turing complete) language needs to be "learned" separately is a bad approach. Trust me, I've started like that as well, and then I rethought the whole approach. The idea here is to familiarize yourself with the basic notions common to all programming languages, like how variables works, how references and pointers work, what's up with functions/methods, and then with data structures, classes and objects.
Then look into basic good coding practices: OO principles (at least the major ones), various kinds of automated tests for your code, etc.
Use the language you're already most familiar with to explore all these. Once you have a good grasp of these basic concepts, familiarizing yourself with a new language will be a breeze.
Yes, of course, each language has it's specifics, like they might treat functions or objects of variables slightly different between themselves, but they have a lot more in common than they have discrepancies.
Continuing on the last idea, Bruce Eckel's Thinking in XXX books are excellent. Finish the one about Java and try to code as many examples from it as possible yourself. Then try Thinking in C/CPP, followed by some books on unit and functional testing. Then go on to stuff about data structures and algorithms, this one's one of my favorites on the subject: http://www.amazon.fr/Data-Structures-Algorithms-Michael-Goodrich/dp/0470398809/ref=sr_1_1?ie=UTF8&qid=1348865961&sr=8-1