Olá,
É interessante ver como as pessoas confundem a portabilidade com o Java.
A grande ‘vantagem’ do java é poder usar um mesmo bytecode em vários sistemas operacionais utilizando a JVM, sem ela nada adianta.
Então para o seu codigo ser ‘portável’ em Java você terá que ter a JVM, e em segundo lugar você não pode fazer nada nativo (obviamente) sem fazer IFs para saber qual sistema operacional está rodando.
Em terceiro, quase nenhum software em Java roda em todos os OS, devido a maioria usar sempre bibliotecas que rodam em um único sistema operacional, geralmente o windows.
Um exemplo disso é o game brasileiro Taikodom que só roda em windows, apesar de ser feito em Java, mas usa bibliotecas que só rodam em windows.
Então, java não é sinonimo de portabilidade, pois todas as linguagens tem um ‘port’ para os outros sistemas operacionais, c++, basic, pascal, python, php, c# e por ai vai.
Java só tem uma vantagem, não é necessário recompilar, mas tem a desvantagem de ter a JVM instalada, e na versão compativel com a aplicação, o que ocorre também com o .Net.
Se você usar no Java somente bibliotecas multiplataformas, então sua aplicação será realmente portável em Java.
Um exemplo é o servidor privado de lineage, 100% em Java, mas como é uma aplicação console e não usa bibliotecas somente para windows, roda em qualquer sistema operacional com uma unica compilação, pois o bytecode é o mesmo para a JVM.
Outro exemplo mas em c++ é o servidor privado do tibia, pode ser compilado com o gcc para windows ou linux, roda também em ambos os sistemas operacionais sem problemas.