class A {
...
}
class B extends A {
...
}
Il mio prof ha detto:
A b = new B(); //si puo fare
B b = new A(); // non si puo fare
Quello che non si puo fare non equivarrebbe a fare un downcasting?
class A {
...
}
class B extends A {
...
}
Il mio prof ha detto:
A b = new B(); //si puo fare
B b = new A(); // non si puo fare
Quello che non si puo fare non equivarrebbe a fare un downcasting?
No, il downcasting è un'altra cosa:Originariamente inviato da 8paolo9
Quello che non si puo fare non equivarrebbe a fare un downcasting?
(questo codice compila)codice:A a = new B(); B b = (B)a;
SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
Di questo libro e degli altri (blog personale di recensioni libri) | NO M.P. TECNICI
grazie per la risposta!!![]()
invece se avessi:
class A {
public void stampa() {
System.out.println("classe A");
}
}
class B extends A {
public void stampa () {
System.out.println("classe B");
}
}
//Main
A oggettoA = new A();
B oggettoB = new B();
//Vorrei far stampare "classe A" richiamando il metodo stampa su oggettoB con la parolina super ma non funziona. Io faccio così:
oggettoB.super.stampa();
//Perchè non funziona?
Non puoi richiamare super su un'istanza, comunque se vuoi invocare il metodo stampa() contenuto nella classe A sull'istanza della classe B allora non devi effettuarne l'override. Se togli il metodo stampa() dalla classe B allora verrà automaticamente invocato quello presente nella classe A, se invece ne effettui l'override verrà invocato sempre e solo quello della classe B.
All'interno della classe B puoi eventualmente invocare il metodo padre utilizzando il super.
In questo modo invocando il metodo stampa() sull'istanza della classe B verrà invocato anche il metodo stampa() della superclasse.codice:class B extends A { public void stampa () { super.stampa(); System.out.println("classe B"); } }
"Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)
capito grazie!!
ho ancora un altro dubbio (scusate le 8000 domande ma ho un esame fra meno di 1 mese e sono in panico totale!!)
class Animale {
string animale;
public void stampa () {
System.out.println("animale");
}
}
class Cane extends Animale {
string cane;
public void stampa () {
System.out.println("cane");
}
}
//Domande:
1- Animale animal = new Cane() equivale a creare un oggetto animal di tipo Animale e poi fare un dowcast?
2- Fare animal = dog; e fare animal = (Cane) dog; equivale a fare la stessa cosa?
3- dopo aver fatto
Animale animal = new Animale();
Cane dog = new Cane();
animal = dog; //ho trasformato animal in un oggetto di tipo Cane, come posso ritrasformare animal in un oggetto di tipo Animale?
Grazie ancora!!
Considera questo esempio:
Per quantop riguarda questo:codice:Animale animal = new Cane(); animal.stampa(); Cane cane = (Cane) animal; // Questo cast è consentito cane.stampa(); Animale anim = new Animale(); Cane can = (Cane) anim; // Questo cast causa un'eccezione a runtime can.stampa();
Animale animal = new Animale();
Cane dog = new Cane();
animal = dog;
non hai trasformato animal in un oggetto di tipo Cane come affermi. In realtà (java lavora per riferimenti e non per valore) hai assegnato ad animal lo stesso riferimento di dog per cui entrambe le variabili puntano allo stesso riferimento.
"Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)
ok, allora quando Java ci lascia fare i downcast? Ogni volta che provo a fare un downcast, java mi lascia compilare però quando eseguo mi lancia un'eccezione del tipo cannot be cast..
Ogni volta che è possibile.Originariamente inviato da 8paolo9
ok, allora quando Java ci lascia fare i downcast? Ogni volta che provo a fare un downcast, java mi lascia compilare però quando eseguo mi lancia un'eccezione del tipo cannot be cast..
E' ovvio che se tenti di effettuare un downcast fra oggetti che non possono essere downcastati otterrai una ClassCastException.
Il downcast è possibile solo quando l'oggetto di tipo A rappresenta effettivamente un oggetto di tipo B. Esempio:
Quel metodo io lo posso invocare in tanti modi:codice:// Questo metodo opera su oggetti di tipo Number public void metodo(Number n) { ... // Effettua delle operazioni su oggetti Number // Ma se l'oggetto Number è specificatamente un Integer, // allora posso anche effettuare queste altre operazioni, che sono // specifiche per gli Integer if (n instanceof Integer) { Integer i = (Integer) n; // downcast che va a buon fine sempre! ... // operazioni specifiche per gli interi } }
Ciao.codice:metodo( new Double(9.2) ); metodo( new Float(4f) ); metodo( new Integer(7) );![]()
"Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza
In fase di compilazione Java non ti darà mai errore in caso di upcasting e downcasting. Il problema verrà riscontrato in fase di runtime.
In pratica è sempre possibile effettuare il downcasting, ma essa andrà a buon fine (senza generare un ClassCastException) solo se l'istanza è comunque del sottotipo.
Come da esempio precedente:
codice:Animale animal = new Cane(); Cane cane = (Cane) animal; // Corretto Animale anim = new Animale(); Cane can = (Cane) anim; // Causa un'eccezione di tipo ClassCastException a runtime
"Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)
cane è sottotipo di animale......... o sbaglio?
Quando ho creato le due classi ho scritto che Cane implements Animale, con questo non si intende che è anche un sottotipo?