Java, apesar de ter uma curva de aprendizagem um pouco grande.
C pode até funcionar na maioria das plataformas, mas algumas coisas podem dar erro de compilação. Um programa Java não é compilado, é em bytecode (um "intermediário" entre código-fonte e executável compilado) e roda totalmente dentro de uma máquina virtual, o sistema operacional só precisa suportar essa máquina.
Windows, Linux e Mac suportam a máquina virtual do Java, sem qualquer necessidade de alteração de código. Um possível contra do Java é que a máquina virtual é um pouco "pesada" e comilona de memória.