Потому что сначала выполняется вызов System.out.printf("Hello world") и уже только после этого результат вызова System.out.printf("Hello world") сравнивается с null
Ладно, с этим ясно
а почему не работает в условии System.out.printLN(arg)?
выбрасывает
the operator == is undefined for the argument type(s) void, null
Потому что согласно документации printf объявлен как public PrintStream printf, т.е. возвращает PrintStream объект и его можно сравнить с null, а println объявлен как void, т.е. ничего не возвращает и поэтому пытаться сравнить ничего и null нельзя, об этом компилятор и ругается. ссылка на документацию docs.oracle.com/javase/6/docs/api/java/io/PrintStr... java.lang.Object...)