it feels old (C-like; primitive static typing that's tied too closely to what the hardware considers a "type") while trying in vain to be new (fancypants OO, "cleanly" designed, and recently adding on newer notions like generics). this, too, adds to the schizophrenia.
its class library (standard library) is badly designed. that's only a minor gripe, as i'm unaware of any really well designed libraries of the type and on that scale; slip-ups are inevitable in such a mass of code. but at very least its maintainers and designers could deign to prune out deprecated old junk, instead of just calling it deprecated in the docs and leaving it there to clutter up documentation and address space alike. i say call it deprecated for two, at most three, releases and then axe it already!
it tries, at times, to do the multi-paradigm thing. the standard library has things in it for "MVC" programming, and parts of it are written on that notion; it's got things in it for much less structured design, and bits of it are quite unstructured indeed. it does both threading and asynchronous I/O. there are i don't know how many different ways to split, assemble, join, and otherwise mess with, the common string datatype, and more keep getting added. what isn't there is a single, overarching vision to give the whole some semblance of focus; instead it rambles all over everywhere trying to do it all at once.
the only language that ever did multi-paradigm tolerably was Common Lisp, and look at what a mess that turned out to be. Java is worse. it tries to hold the users' hands and restrain them from doing "naughty" things in the true tradition of a bondage-and-discipline language (no operator overloading for you!) while failing to impose this on the language itself ("+" means "add primitive integers", except when it means "concatenate strings", and arrays are a kind of class-yet-not a class that i'm sure no mere luser could write the likes of however hard they tried). the hypocrisy becomes annoying quickly.
it sees the usefulness of fewer restrictions in theory -- there's the "reflection" API for metaclass hacking -- but it doesn't have the sense to take this seriously -- the reflection API is far too much a pain to actually use much. (plus, "security managers" can nullify much of the real usefulness of reflection. i'm sure there's some Turing rat-hole in that wall, too, if one only poked around enough, but the very notion of trying to make your language less useful disgusts me too much to put in the effort.)
it goes on like this throughout the whole story, trying to play both sides of every trade-off it encounters. the result is a thoroughly unsatisfying language, more verbose than COBOL while at the same time more confused and confusing. don't use unless forced.