Possiamo assumere valori di array predefiniti in Java? ad esempio, supponiamo che un array int sia impostato su tutti gli zeri?

In pratica posso supporre che tutti gli array int in Java inizieranno con degli zeri? per tutte le macchine in cui viene eseguita la JVM?

È vero per tutti i tipi? char? boolean? enumerazioni?

Dove è documentato ufficialmente?

I libri di testo ho detto che gli array int sono impostati a zero ma raccomandano anche che si debba scrivere un ciclo for per impostare tutti i valori a zero solo “per essere più chiari”.

Java Language Specification è il posto giusto per cercare tali informazioni:

I componenti dell’array sono variabili senza nome che vengono create e inizializzate su valori predefiniti (§4.12.5) ogni volta che viene creato un nuovo object che è una matrice

I valori predefiniti sono forniti nella sezione 4.12.5 .

  • Per tipo byte , il valore predefinito è zero, ovvero il valore di (byte) 0 .
  • Per tipo short , il valore predefinito è zero, ovvero il valore di (breve) 0 .
  • Per tipo int , il valore predefinito è zero, ovvero 0 .
  • Per tipo lungo , il valore predefinito è zero, ovvero 0L .
  • Per il tipo float , il valore predefinito è zero positivo, ovvero 0.0f .
  • Per il tipo double , il valore predefinito è zero positivo, ovvero 0.0d .
  • Per tipo char , il valore predefinito è il carattere null, ovvero ‘\ u0000’ .
  • Per tipo booleano , il valore predefinito è falso .
  • Per tutti i tipi di riferimento, il valore predefinito è null .

Sì. I tipi primitivi in ​​Java sono sempre inizializzati a zero. I riferimenti sono anche inizializzati su null.

Dovrebbe essere la specifica del linguaggio Java §4.12.5 Valori iniziali delle variabili . invece di §4.5.5

“Per tipo byte, il valore predefinito è zero, ovvero il valore di (byte) 0.
Per tipo short, il valore predefinito è zero, ovvero il valore di (breve) 0.
Per tipo int, il valore predefinito è zero, ovvero 0.
Per tipo lungo, il valore predefinito è zero, ovvero 0L.
Per il tipo float, il valore predefinito è zero positivo, ovvero 0.0f.
Per il tipo double, il valore predefinito è zero positivo, ovvero 0.0d.
Per tipo char, il valore predefinito è il carattere null, ovvero ‘\ u0000’.
Per tipo booleano, il valore predefinito è falso.
Per tutti i tipi di riferimento (§4.3), il valore predefinito è nullo. ”

Il tuo libro di testo è sbagliato! Scrivere un codice del genere è inutile, e sprecare il tuo tempo a digitarlo e ai computer che lo eseguono.

Come altri hanno già detto, il compilatore garantisce che le variabili esterne ai metodi (variabili di class / istanza) abbiano un valore di 0, falso o nullo. Come probabilmente saprai, il compilatore non fornisce le variabili all’interno dei valori dei metodi e invece ti obbliga a dare loro un valore prima che vengano utilizzati.

Scoprirai che se fai le cose nel modo giusto, circa il 90% -95% delle tue “variabili” non cambia mai dopo aver ricevuto un valore. Tuttavia, i nuovi programmatori tendono a fare cose del genere:

 int x = 0; // some code that never uses x x = 5; // more code that only reads x and never modifies it. 

questo ti impedisce di poter contrassegnare x come “finale”. Se sei in grado di contrassegnare x come “finale”, allora previene la modifica accidentale del valore, che impedisce bug.

Vorrei scrivere il codice come:

 final int x; // some code that never uses x x = 5; // more code that only reads x and never modifies it. 

Questo è chiamato un vuoto finale (una variabile finale che non ha un valore quando è dichiarata).

Se si ricorda che le variabili di class / istanza vengono inizializzate dal runtime, si spera che non si scriva codice per inizializzarle con valori di eliminazione e che quindi si possano contrassegnare come finali.

La mia pratica personale è quella di contrassegnare sempre tutto come finale finché non trovo che ho bisogno di modificarlo, e di non inizializzare mai una variabile finché non conosco il valore effettivo che voglio che abbia. In questo modo, il codice diventa più veloce (non evidente poiché i compiti sono in genere molto rapidi) e più sicuro poiché raramente accidentalmente modifichi un valore quando non dovrei.