Singleton pattern kullanıldığından sadece bir kez oluşturulup aynı nesneyi kullanmak için Runtime'da kullanılan ortama uygun bir obje construct ediliyor. Java, tek bir platforma ait olmadığı için out nesnesi duruma göre farklı tipte objeleri tutması gerekir. Hangi PrintStream objesine ihtiyacımız olduğunu Compile time sırasında bilemeyiz. Abstraction'ın getirdiği bir yükümlülük. (Bkz. Bridge Pattern)
out her zaman cmd'ye yazı yazdırmak için kullanılmayacak. Eğer çalıştığı ortam bir tarayıcı ise geliştirici consolu; linux, unix ise terminal olacak. Basitleştirerek anlatıyorum ancak bu konular sandığınızdan daha derin. Merakınız varsa araştırmanızı öneririm.