Non ho ben capito qual'è il tuo problema, visto che non capisco cosa tu intenda per "letterale"... comunque, vediamo di tentare di fare un po' d'ordine:
quando io scrivo "Ciao".length() io intendo applicare il metodo length() all'oggetto stringa "Ciao". Questa può essere vista come una costante (in realtà, è una costante). La costante che possiede 4 caratteri.
Quando scrivo, quindi, System.out.println("Ciao".length()) non ha nessuna importanza quanti oggetti String io abbia istanziato con la scritta "Ciao"... quel metodo viene applicato a quella particolare costante.
Poi, non è affatto la stessa cosa scrivere
String miaStringa1 = new String("Ciao");
oppure scrivere
String miaStringa2 = "Ciao".
La prima fa in modo di creare un oggetto nello heap contenente la scritta "Ciao" e alloca un puntatore nello stack a quell'oggetto, indicato dalla variabile miaStringa1.
La seconda, invece, alloca nello stack 4 caratteri individuati dalla variabile miaStringa2 (in un certo senso).
Se, infatti, proviamo ad applicare l'operatore di confronto binario == al primo oggetto, per confrontarlo con la costante "Ciao" ci verrà restituito un valore false, mentre nel secondo caso avremo un true:
(miaStringa1 == "Ciao") --> false
(miaStringa2 == "Ciao") --> true
Il fatto è che, in Java, sia una costante stringa, sia un oggetto String sono entrambi visti come un oggetto. Per questo, sia ad un oggetto creato con new, sia ad una costante creata con l'uso delle virgolette, è possibile applicare i metodi di String.
Non capisco l'ultima domanda... potresti riformularla? :master:
Ciao.



Rispondi quotando