Xai: I am not going to start a C++ vs. Java crusade - I use both in my work, and right now, couldn't do without either.
However, there's a few things in what you say that I feel stems from misunderstandings:
Java IS portable - meaning the distributed code (binaries) are portable. And the Java run-time should not be compared to a Playstation emulator since the latter is mainly a HW emulator, the Java RT is not. There is a huge difference between an emulation of a system and a system that is "designed to be emulated", so to speak.
Reg. creating code as efficiently as the platform allow: That is exactly the problem with conventional programming languages (C/C++) - most code we write today is targeted at - Two PCs today are not just two PCs, they have different processors (instruction sets), different pipeline technology, different cache size and memory, different bus speeds, not to mention various add-on HW (3D accel., sound cards w/ DSP etc.etc.). Byte code can be optimized on the fly to match the environment, machine code cannot (or, it is extremely hard to do so). IOW: I do not believe in "byte code" processors, the strength of bytecode is that it is HW independent.
Java is simple compared to C/C++ because:
1) The file structure is simple - one file, one class. If you want to create a re-useable component, the .class is all you need. No .lib, no .h, no typelibraries etc.etc.
2) Garbage collection removes the most annoying pitfalls of C/C++. (And yes, you could write your own, but that is NO easy task if you want one that works fast without annoying artifacts)
3) Java is typesafe (which C is not)
4) A lot of the "smart" features of C++ (IMHO) only add to the confusion when learning the language: operator overloading, templates, multiple inheritance.
Finally, reg. multiple inheritance - there are really good reasons not to have it. In particular that it can't be implemented in a clean way. Java has "interfaces" as the way to solve the problem. Intefaces are not a 1:1 substitute, but it works well in most situations. (I've missed mutiple inheritance a couple of times myself, but in the long run I prefer a clean language).
Splat:
You CAN invoke the garbage collector (System.gc() I believe)
For cool stuff, check out the following sites:
ftp://ftp.gathering.org/pub/TG/TG99/javademo/
ftp://ftp.gathering.org/pub/TG/TG98/java/
(forward.zip is available in the latter)
/Niels