Buon giorno vorrei un piccolo chiarimento su una situazione che mi sono trovato ad affrontare.
Mi sto esercitando in java, quindi verso questo linguaggio di programmazione sto muovendo i primi passi. Ho scritto questo codice.

codice:
import java.io.*;


class infosistema
{
  public static void main(String[] argomenti)
  {
    System.out.println("Richiedi la specifica che preferisci e premi [INVIO]. \nPer uscire dal programma scrivi 'end'");  //stampa istruzioni
    
    // in 'a' prendiamo il flusso di standard input
    InputStreamReader a = new InputStreamReader(System.in);


    // sfruttiamo un BufferedReader per contenere il flusso 
    // di byte
    BufferedReader IN = new BufferedReader(a);
    
    // e convertirlo in una stringa
    String s = new String();
    String tipo = new String();
    String tmp = new String();
    // finché non si verifica la condizione di uscita
    while(s.compareTo("end")!=0)
    {
      try {
        s= IN.readLine(); // Legge il contenuto della riga


      } catch (IOException e) {
        s="ERRORE DI LETTURA";
      };


      //   String tipo; 
      //   String tmp;
      // e lo stampa
      switch (s)
      {
       case "sistema operativo":
        tipo="Sistema Operativo: ";
        tmp=System.getProperty("os.name");
       break;
      }
      System.out.println(tipo+tmp);
    }
  }
}
Come potete vedere nella parte finale del codice ho inserito la dichiarazione delle stringhe tmp e tipo senza dichiararle new String(). Perché se le dichiaro new string(); funzionano e se dichiaro semplicemente String tmp mi risultano come errore ovvero non inizializzate?
La seconda forma necessita di una inizializzazione in fase di definizione per poter essere considerata funzionante?