View Full Version : java : VOID ?
Tony Hak
08-07-2007, 09:38
ciao! sto studiando java per un esame che devo affrontare a fine luglio e mi so sempre domandato: che cos'e' il VOID ? .. che significa ? di solito lo vedo scritto dove c'e' un metodo ... grazie e buona Domenica ;)
AnonimoVeneziano
08-07-2007, 09:45
significa che non ritorna niente
Ciao
Dominioincontrastato
08-07-2007, 09:48
Una funzione di questo tipo per esempio
void scrivi (void)
{
System.out.println("W amd");
}
Prevede che alla funzione non venga passato nessun parametro e che al termine dell'esecuzione della funzione, la funzione stessa non restiuisca nessun valore o stringa.
Claro?:D
Tony Hak
08-07-2007, 09:52
sisi ! :D il prof nn l'ha messo sugli appunti ! :D grazie mille..nel caso che ho altri dubbi posso sempre contare su di voi ?
viva l'AMD :D .. eheh
ciao! sto studiando java per un esame che devo affrontare a fine luglio e mi so sempre domandato: che cos'e' il VOID ? .. che significa ? di solito lo vedo scritto dove c'e' un metodo ... grazie e buona Domenica ;)In Java l'unico utilizzo della parola chiave 'void' è per indicare che un metodo non ha un valore di ritorno.
es. public void unMetodo () { ..... }
void scrivi(void)
non è Java.
Tony Hak
08-07-2007, 10:25
i miei dubbi sono :
-il costruttore di default non è visibile?
-cosa accade quando trovo scritto :
Classe1 a = new Classe2();
o
Classe1 a = new Classe2(23,5,1964)
questi sono i dubbi delle prime 2 lezioni :P
grazie per l'aiuto prezioso
Dominioincontrastato
08-07-2007, 10:25
void scrivi(void)
non è Java.
è vero che la funzione va inglobata in una classe e che ci vuole private o public prima della funzione e che non scrivere nulla tra le parentesi tonde equivale a void, ma l'esempio era puramente didattico
-il costruttore di default non è visibile?
-cosa accade quando trovo scritto :
Classe1 a = new Classe2();
o
Classe1 a = new Classe2(23,5,1964) Dipende dai costruttori che ci sono!
Tony Hak
08-07-2007, 10:35
Dipende dai costruttori che ci sono!
quindi si ha la chiamata a un costruttore.....ma .. se la "a" è del tipo della mia classe come fa a creare un oggetto di un'altra classe....
quindi si ha la chiamata a un costruttore.....ma .. se la "a" è del tipo della mia classe come fa a creare un oggetto di un'altra classe....Se Classe2 estende Classe1, allora è ok. Altrimenti è un errore.
Tony Hak
08-07-2007, 10:47
Se Classe2 estende Classe1, allora è ok. Altrimenti è un errore.
AAA ecco .... sto capendo un sacco di cosa grazie a voi .. quindi ... io ho classe1 extends classe2 ... ad esempio .. e nel main ho classe1 a = new classe2(23,09,1984) ,... quindi in poche parole la variabile A di tipo classe1 va a richiamarsi il costruttore della classe2 andando a sostituire i valori per copia 23 09 1984 ....... giusto ? .. se invece la classe1 non estende la 2 ... allora è errore di compilazione . Ho capito bene ?
AAA ecco .... sto capendo un sacco di cosa grazie a voi .. quindi ... io ho classe1 extends classe2 ... ad esempio .. e nel main ho classe1 a = new classe2(23,09,1984) ,... quindi in poche parole la variabile A di tipo classe1 va a richiamarsi il costruttore della classe2 andando a sostituire i valori per copia 23 09 1984 ....... giusto ? .. se invece la classe1 non estende la 2 ... allora è errore di compilazione . Ho capito bene ?No no ... alt fai un po' di confusione.
Ammesso di avere:
class Classe1 { }
class Classe2 extends Classe1 {
public Classe2 (int a, int b, int c) {
//....
}
}allora sì, puoi fare:
Classe1 a = new Classe2 (10, 20, 30);
Tony Hak
08-07-2007, 10:54
No no ... alt fai un po' di confusione.
Ammesso di avere:
class Classe1 { }
class Classe2 extends Classe1 {
public Classe2 (int a, int b, int c) {
//....
}
}allora sì, puoi fare:
Classe1 a = new Classe2 (10, 20, 30);
okok! :D avevo detto il contrario .. ora tutto mi sta tornando chiaro :) .. e ho capito anche perche' sbaglio i quiz del prof :D .. eheh! grazie mille !
ora tutto mi sta tornando chiaroComunque ci sono tutta una serie di regolette relative ai costruttori e in generale alla fase di inizializzazione degli oggetti ... ed è bene conoscerle molto bene perché sono fondamentali.
Tony Hak
08-07-2007, 11:06
Comunque ci sono tutta una serie di regolette relative ai costruttori e in generale alla fase di inizializzazione degli oggetti ... ed è bene conoscerle molto bene perché sono fondamentali.
si , indubbiamente..ma questo è un corso base di java :) .. poi l'anno prossimo ho java2 :D .. senti una curiosita' : facendo col new come descritto nel tuo esempio c'e' un richiamo del costruttore della sottoclasse mentre facendo super si ha il richiamo del costruttore della superclasse ?
è vero che la funzione va inglobata in una classe e che ci vuole private o public prima della funzione e che non scrivere nulla tra le parentesi tonde equivale a void, ma l'esempio era puramente didattico a maggior ragione... ma mi sa che non hai ancora capito bene percché non era Java: void tra le parentesi non ce lo puoi mettere, devi lasciare vuoto.
si , indubbiamente..ma questo è un corso base di java :) .. poi l'anno prossimo ho java2 :D .. senti una curiosita' : facendo col new come descritto nel tuo esempio c'e' un richiamo del costruttore della sottoclasse mentre facendo super si ha il richiamo del costruttore della superclasse ? intendi chiamando super all'interno del costruttore della sottoclasse? si, serve a quello... per esempio:
class Class1 {
public Class1(String s) {
System.out.println(s);
}
}
class Class2 extends Class1 {
public Class2() {
super("asd");
System.out.println("lol");
}
}
questo esempio stampa
asd
lol
Tony Hak
08-07-2007, 11:35
intendi chiamando super all'interno del costruttore della sottoclasse? si, serve a quello... per esempio:
class Class1 {
public Class1(String s) {
System.out.println(s);
}
}
class Class2 extends Class1 {
public Class2() {
super("asd");
System.out.println("lol");
}
}
questo esempio stampa
asd
lol
ok :D .. tnk's :) .. a piu' tardi :D
Tony Hak
09-07-2007, 16:21
questo quiz che nn l'ho capito :( ..
l'evidenziatore verde è la risp corretta ..
http://img530.imageshack.us/img530/2872/39693195zw3.jpg (http://imageshack.us)
perche' nn compilano e gli altri si ?
la a non compila perché il modificatore private abbassa la visibilità del metodo, la quale può essere solo alzata o mantenuta. la e invece non compila perché il prototipo del metodo differisce solo per il tipo del valore di ritorno: se una classe avesse due metodi identici differenti solo per il tipo di ritorno verrebbero a crearsi delle ambiguità nel codice che usa uno di quei due metodi: non sarebbe chiaro quale dei due si sta usando, e quindi di che tipo dovrebbe essere il valore di ritorno.
La covarianza del tipo restituito definisce come sovrascrittura la ridefinizione di un metodo del supertipo in un sottotipo che differisca per il tipo di valore restituito se questo sia compatibile in assegnamento con l'originale.
Cioè:
class A {
Number fai(int a, float b) { ... }
}
class B extends A {
Long fai(int a, float b) { ... }
}
è valido.
l'evidenziatore verde è la risp corretta ..
perche' nn compilano e gli altri si ?Il quiz che hai postato è relativo al concetto di override. Ci sono una serie di regole:
Il metodo che fa l'override (nella sottoclasse quindi)
1) deve avere la stessa identica signature (nome+parametri) e lo stesso valore di ritorno (con l'eccezione del return covariante di Java 5+, che riguarda solo i tipi reference).
2) non deve avere un livello di accesso più ristretto ma può avere un livello di accesso meno ristretto.
3) Non può dichiarare eccezioni checked nuove o più "ampie" ma può dichiarare meno eccezioni checked o eccezioni checked più ristrette. Può dichiarare qualunque eccezione unchecked.
4) Il metodo nella superclasse di cui si fa l'override non deve essere marcato private (altrimenti non viene ereditato) o final (altrimenti non può esserci un override).
Basandosi su queste regole:
La risposta a) non compila perché in Over il livello di accesso è il default e il private del override è più ristretto del default.
La risposta e) non compila perché il tipo di ritorno è diverso.
Le altre risposte compilano perché sono altri casi di override/overload corretti.
Tony Hak
09-07-2007, 18:18
grazie del pronto intervento :)
La covarianza del tipo restituito definisce come sovrascrittura la ridefinizione di un metodo del supertipo in un sottotipo che differisca per il tipo di valore restituito se questo sia compatibile in assegnamento con l'originale. e long è compatibile con int in assegnamento? se non erro in Java long occupa 64 bit, quindi assegnarlo ad un int dovrebbe significare perderne 32.
La covarianza del tipo restituito definisce come sovrascrittura la ridefinizione di un metodo del supertipo in un sottotipo che differisca per il tipo di valore restituito se questo sia compatibile in assegnamento con l'originale.
Cioè:
class A {
Number fai(int a, float b) { ... }
}
class B extends A {
Long fai(int a, float b) { ... }
}
è valido. uhm, non vorrei dire ma ho fatto un esperimento che sembra contraddire le tue affermazioni: in Java 6 (cioè in compatibilità solamente con Java 6, senza retrocompatibilità impostata nelle opzioni del compilatore, uso Eclipse 3.2) ho esteso una classe non astratta che aveva un metodo che ritornava int. ho reimplementato quel metodo facendogli ritornare long e dava errore; con short stessa cosa. ho capito male io? :wtf:
Perchè mai questo pazzo PGI-Bis avrà usato Number e Long nel suo esempio? :D
Perchè mai questo pazzo PGI-Bis avrà usato Number e Long nel suo esempio? :D aaaah ho capito... :wtf:
praticamente se il metodo originale ritorna una certa classe, nel suo override devo ritornare o quella classe o una che la estende :D
praticamente se il metodo originale ritorna una certa classe, nel suo override devo ritornare o quella classe o una che la estende :DEsatto. La covarianza vale solo per i tipi reference. Dopotutto è vero che un Long è-un Number mentre non è vero che un int è un long o viceversa!
E andando un po' più a fondo .... la covarianza sul valore di ritorno viene implementata con i metodi "bridge".
Dato:
class A {
public Number prova () { return 123; }
}
class B extends A {
public Long prova () { return 123L; }
}Se si lancia (dopo aver compilato): javap B si scopre che la classe B in realtà ha 2 metodi prova:
public java.lang.Long prova();
public java.lang.Number prova();
Il metodo che ritorna Number è un metodo "bridge", sintetizzato dal compilatore e fa nient'altro che chiamare il metodo che ritorna Long. Perché? Per mantenere la compatibilità!
Tony Hak
13-07-2007, 10:09
eheh .. mi fa piacere che i miei dubbi creano vere e proprie discussioni :D .. :) .. sapete spiegarmi il cast esplicito ed implicito ? .... non c'ho capito molto e su internet ci sn poki esempi ... tnk's
sapete spiegarmi il cast esplicito ed implicito ?Il cast è la conversione da un tipo ad un altro. Le regole sono molte (vedere sul JLS <qui> (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.5)).
Alcuni cast possono essere impliciti, altri cast devono essere fatti esplicitamente usando l'apposito operatore di cast, il tipo tra parentesi tonde es. (int)
A parte le conversioni particolari, le due fondamentali sono conversioni di widening (ampliamento) e di narrowing (restringimento). Entrambe si possono applicare ai tipi primitivi e ai tipi reference.
Cosa non ti è chiaro di preciso? Purtroppo non è che posso enunciare qui in un unico post tutte le regole e le specifiche. ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.