2014-12-15 12 views
6

Non riesco a capire perché questa riga di codice non può essere compilato:Stringa su Object ma non Object to String?

String str = new Object(); 

mentre il seguente fa:

Object o = new String("Hello"); 

Alla mia comprensione, String, come ogni altra classe, si estende Object . Quindi, perché la prima riga non viene compilata?

+0

Il tipo di oggetto sulla destra deve essere o estendere il tipo sulla sinistra. L'oggetto non è una stringa né estende la stringa. – csmckelvey

+19

È necessario trovare un testo di base sulla programmazione orientata agli oggetti e studiarlo. (Scherzi a parte: non capirai i concetti dalle risposte di 100 parole su SO). –

risposta

23

Perché String è un Object, ma non è un ObjectString, proprio come ogni arancione è un frutta, ma non tutti i frutti è un arancione.

String è una classe che estende Object, quindi si può semplicemente scrivere:

Object obj = "string"; 

Ma Object non si estende String, quindi:

String str = new Object(); 

non verrà compilato.

Anche se, se si dispone di un Object, ed è un String, si può fare qualcosa che si chiama casting di tipo o semplicemente colata:

String str = (String) myObject; 

ma potrebbe lanciare una ClassCastException se myObject non è in origine il tipo di String

Qui, è possibile trovare ulteriori informazioni su Casting oggetto in Java: http://www.javabeginner.com/learn-java/java-object-typecasting

+0

Quindi l'istruzione String str = new Object(); si traduce approssimativamente in: str è un oggetto di tipo String? Sto cercando di ottenere una comprensione intuitiva di come leggere quella riga di codice. – wonggr

+0

Se il proprio oggetto è una stringa, allora si può fare String str = (String) oggetto; Conosciuto come "Casting" – Victor2748

+0

Risposta chiara impressionante. Lo capisco adesso, grazie! – wonggr

4

Per questo genere di cose è utile distinguere tra il tipo di una variabile, stabilito nella sua dichiarazione, e la classe di un oggetto, stabilita al momento della creazione dell'oggetto.

Una variabile può essere null o per puntare a qualsiasi oggetto la cui classe corrisponde al suo tipo o è una sottoclasse diretta o indiretta di tale classe. Poiché String è una sottoclasse di Object, una variabile di tipo Object può puntare a un oggetto della classe String.

Nel tuo esempio, il compilatore sa che un'espressione String deve essere null o scegliere un oggetto String, così Object o = new String("Hello"); è noto al momento della compilazione corretta.

D'altra parte, un'espressione o una variabile di tipo Object può fare riferimento a una stringa, ma può fare riferimento a qualcosa di completamente diverso. Il compilatore richiede un cast esplicito per dire che la conversione è OK.

public class Test { 
    public static void main(String[] args) { 
    Object stringObject = "xyzzy"; 
    Object integerObject = new Integer(3); 
    String test1 = (String)stringObject; 
    System.out.println(test1); 
    String test2 = (String) integerObject; 
    System.out.println(test2); 
    } 
} 

Questo programma viene compilato perché ho detto al compilatore le conversioni sono OK con i miei calchi.Corre attraverso la prima chiamata println, perché stringObject punta davvero a String. Non riesce con un ClassCastException sulla riga String test2 = (String) integerObject;. Per quanto sa il compilatore, integerObject potrebbe puntare a un String, quindi ha accettato il mio cast. In fase di esecuzione, la JVM rileva che punta davvero a un Integer e genera l'eccezione.

L'uso del tipo Object per interoOggetto è significativo. Ciò rende la conversione String test2 = (String) integerObject; di un'espressione di tipo type in string String, una conversione che potrebbe riuscire, a seconda di cosa siano effettivamente i riferimenti di integerObject. Se integerObject avesse dichiarato il tipo Integer, il compilatore avrebbe rifiutato il programma. Non esiste un oggetto a cui è possibile fare riferimento tramite entrambe le espressioni Integer e String.