Recs.
Updated
Specs
Pros
Pro The JVM
Without Java, we wouldn't have the JVM. For all its faults, there's some pretty neat stuff being done on the JVM. Things like Kotlin wouldn't exist if it weren't for the JVM and Java's faults. Clojure is just a Lisp implementation, but because of the JVM, it was instantly portable.
Pro Well thought out packaging structure
Class, the basic unit of Java code, belongs to a package which is a naming mechanism allowing reuse of class names perhaps written by different organizations.
For example, one organization can write a Java library with whatever names they want in the package com.company1, and another organization write a library with whatever names they want, including the same names, in the package com.company2, and there is never a name collision and all classes can be used as desired.
Cons
Con Some idioms require by the built in libraries are complex.
There are many idioms need to use some aspects of the language that make simple programs more complex than seems justified.
For example having to compose several objects together to read a file is frustratingly complex and difficult to remember. Fortunately googling what you want to do will lead you to code fragments.
Likewise threading is somewhat obscure to do in the recommended manner although the straight forward use of Thread works fine.
Con More syntactic sugar than most people would like.
There is a lot of boiler plate coding to get started. While useful in larger application the boiler plate is difficult for beginning programmers in the language.
import blah
package packages names
class class name {
public void main (String [] args) {
}
}
Con There's only one way to do it: the Java way
Java developers tend to approach things the same way: the Java way. This shows when they're writing code in a different language. They have a tendency to over-abstract/over-engineer the simplest of things, make everything OO, even the simplest of things, and often are reluctant to consider an approach other than OOP.