Почему вот так нормально отрабатывает
PrintStream stream = System.out;
 System.setOut(stream);
а, вот так уже нет
System.setOut(System.out);
и почему вот так можно
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
   PrintStream printStream = new PrintStream(byteArrayOutputStream);
   System.setOut(printStream);
а вот так нет
System.setOut(new PrintStream(new ByteArrayOutputStream()));