PDA

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

andbin
08-07-2007, 09:52
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 () { ..... }

PGI-Bis
08-07-2007, 10:18
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

andbin
08-07-2007, 10:31
-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....

andbin
08-07-2007, 10:41
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 ?

andbin
08-07-2007, 10:51
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 !

andbin
08-07-2007, 10:59
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 ?

71104
08-07-2007, 11:25
è 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.

71104
08-07-2007, 11:30
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 ?

71104
09-07-2007, 17:04
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.

PGI-Bis
09-07-2007, 17:12
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.

andbin
09-07-2007, 17:17
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 :)

71104
09-07-2007, 20:40
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.

71104
09-07-2007, 20:44
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:

PGI-Bis
09-07-2007, 21:03
Perchè mai questo pazzo PGI-Bis avrà usato Number e Long nel suo esempio? :D

71104
09-07-2007, 22:17
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

andbin
10-07-2007, 08:31
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

andbin
13-07-2007, 10:33
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. ;)