> Java has always been an object oriented programming language
And C++ has always been an “OOP” language.
But they are both a dumped down version of OOP as they both don’t have metaclass support or extreme late binding.
For something more aligned to OOP look at smalltalk or Ruby
If you grab specific favourite functionality, this quickly becomes a no-true-scotsman situation. We know what OOP looks like in general. First-class metaclasses support is not available in Java, but if you really need it for some specific cases, you do them at compile time using annotations processor. The extreme-late-binding as Alan Key would like it does indeed make Java an inferior OOP. Service registration does this on a macro scale though. (although I've seen more abuse of micro-scale extreme late binding than use of it in good design)
async language features are just inline co-routines. Inline co-routines are a useful concept. It's a single tool in a big toolbox of other tools and not every problem requires the same tool, just like OOP features. It's just more stuff you can use if you want. If you don't want it, you don't have to use it, you can just write Haskell or OCaml without using objects and not worry about it and you won't have to worry about how long you live.