I first taught myself C (on a Vax 11/780) over 20 years ago, and then in 95 started using C++ to work with Microsoft's Foundation Classes (MFC) which are its GUI libraries. I also taught myself Java and wrote an industrial control application that used Java and Visual Basic to talk to a sheet-metal folding machine.
Since then I've used Java for a RAID management tool, using JNI, and also to prototype a medical instrument, also using a JNI I wrote. Java is so much cleaner than C++, you never want to touch C++ again. Its interfaces are better than inheriting from multiple classes, its exception handling much cleaner, its typing is well defined (what a concept! Its missing from C, C++ of course.), the libraries are nice, the abstraction is natural, not kludged in as it is in C or C++.
But on my last project, embedded medical firmware, we had to use C. But I enforced "object oriented C" where you define classes and maintain encapsulation with instances and static (file-local) variables. EG ScriptEngine.c, ScriptEngine.h, contains functions of the form ScriptEngine_blahBlah(...). There might be a ScriptEngineInstance.h structure which ScriptEngine_ functions take as a "this" argument, which is how multiple instances are handled. If a class is a singleton, or there's a single global state, you can use the C "static" keyword to hide variables in the class' .c file. And you can define private functions as "static" too, to hide them.
I hate the way "static" has so many meanings.
So, I'd rather program in Java the rest of my life, but I can manage some of its best features in disciplined C.
There are attempts to have real-time Java, and microprocessor support for the Java VM instruction set, but these are not common and look "risky" to engineering firms that are experienced in older ways.
Note also that when doing embedded programming, and/or real-time programming, some of the memory games that C++ and naif Java will do are bad. So you have to use the right real-time supporting garbage-collection (and design & implementation) strategy or avoid certain calls (malloc()) and libraries. Fascinating stuff but C still rules in 2009.