Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
Abbiamo provato per diverse settimane il nuovo Magic V5 di HONOR, uno smartphone pieghevole che ci ha davvero stupito. Il device è il più sottile (solo 4.1mm) ma non gli manca praticamente nulla. Potenza garantita dallo Snapdragon 8 Elite, fotocamere di ottima qualità e batteria in silicio-carbonio che garantisce un'ottima autonomia. E il Prezzo? Vi diciamo tutto nella nostra recensione completa.
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro)
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro)
Google Pixel 10 Pro XL è il top di gamma della serie Pixel, presentando un ampio display Super Actua da 6.8 pollici insieme alle novità della serie, fra cui la ricarica wireless magnetica Pixelsnap e le nuove funzionalità AI avanzate. Il comparto fotografico include un sistema a tripla fotocamera con zoom Pro Res fino a 100x, mentre il processore Tensor G5 con 16GB di RAM garantisce prestazioni percepite molto elevate su Android.
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico
Forte della piattaforma Qualcomm Snapdragon X, il notebook Lenovo IdeaPad Slim 3 riesce a coniugare caratteristiche tecniche interessanti ad uno chassis robusto, con autonomia di funzionamento a batteria che va ben oltre la tipica giornata di lavoro. Un notebook dal costo accessibile pensato per l'utilizzo domestico o in ufficio, soprattutto con applicazioni native per architettura ARM
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-06-2007, 18:01   #1
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
[Java]: output programma

Ragazzi mi spiegate perchè l'output di questo programma è:
B1:3
B1:3
B1:3
true
invece di:
C: 3
B1: 3
C: 3
true

ecco il programma:
Codice:
class A {
	public String f(A other, int n) { return "A:" + n; }
}

class B extends A {
	public String f(A other, int n) { return "B1:" + n; }
	public String f(A other, long n) { return "B2:" + n; }
}

class C extends B {
	public String f(Object other, int n) { return "C:" + n; }
}

public class Test {
	public static void main(String[] args) {
		C gamma = new C();
		B beta = new B();
		A alfa = gamma;
		System.out.println( alfa.f(beta, 3)) ;
		System.out.println(beta.f( alfa , 3)) ;
		System.out.println(gamma.f(alfa, 3)) ;
		System.out.println( alfa.equals(gamma));
	}
}
__________________
HU Queen Member
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2007, 20:15   #2
Otsyke
Junior Member
 
Iscritto dal: Feb 2007
Messaggi: 19
stai provando a fare la certificazion java?

cmq ecco il motivo:
alfa, anche se dichiarato di tipo A, a runtime è un oggetto di tipo C, ed è questo che conta quando si tratta di richiamare i metodi.
Inoltre nella classe C, la funzione f non è un override, bensì un overload. Quindi:

1. quando chiami alfa.f o gamma.f stai chiamando lo stesso metodo.
2. il metodo ereditato da B e quello ridefinito sono due metodi differenti ma con lo stesso nome.

Essendo presenti sia f(Object other, int n) che f(A other, int n), il match migliore per una sottoclasse di A è sicuramente quello ereditato da B, quindi viene chiamato quello sia nel primo che nel terzo caso.
Otsyke è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2007, 23:24   #3
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
C'è una ragione profonda per cui si è portati a rispondere C:3 alla prima e alla terza, la stessa che ci ha salvato le chiappe dai leoni nella savana poco dopo la nostra discesa dall'albero.

Chi ha scritto quel test o non la conosce, e allora avrebbe dovuto astenersi, o l'ha fatto apposta, e allora quel test non certifica la conoscenza del linguaggio di programmazione Java ma l'attitudine a risolvere rebus e sciarade.

Comunque (e con un sospiro di rassegnazione) la ragione per cui "C:3" è che nella classe C, come peraltro ritengo tu sappia, esistono tre metodi:

public String f(Object other, int n) { return "C:" + n; }
public String f(A other, long n) { return "B2:" + n; }
public String f(A other, int n) { return "B1:" + n; }

Questo per via dell'estensione.

L'enunciato:

alfa.f(beta, 3)

appare in un punto in cui tutti e tre quei metodi sono accessibili (bella forza, sono accessibili ovunque).

Sono anche applicabili? Vediamo.

f(beta, 3), beta è un B, 3 è un int, quindi l'invocazione è per un metodo:

f(B, int)

Per essere applicabile ad un'invocazione un metodo deve avere un numero di parametri pari a quello dell'invocazione (salvo arità) ed ogni parametro deve essere dello stesso tipo o di un supertipo del corrispondente valore usato nell'invocazione. Il metodo deve avere lo stesso nome dell'invocazione, ovviamente. Diamolo per scontato.

Quanti dei metodi "f" contenuti in c hanno due parametri? Tutti e tre.

Quanti dei metodi "f" contenuti in c hanno come primo parametro un tipo che è B o un supertipo di B? Tutti e tre.

Quanti dei metodi "f" contenuti in c hanno come secondo parametro un tipo che è "int" o un supertipo di "int"? Tutti e tre.

Il linguaggio stabilisce che quando ti trovi incartato in questo modo infame tu debba passare alla scelta del "metodo più specifico in assoluto".

Dati due metodi H e K, accessibili ed applicabili ad una stessa invocazione, H è più specifico di K se:

il primo parametro di H è sottotipo del primo parametro di K;
il secondo parametro di H è sottotipo del secondo parametro di K;
il terzo parametro di H ... eccetera eccetera finchè ci sono parametri.

Intendo con sottotipo il più lungo "tipo o sottotipo".

Riprendiamo i tre metodi, accessibili ed applicabili:

public String f(Object other, int n) { return "C:" + n; }
public String f(A other, long n) { return "B2:" + n; }
public String f(A other, int n) { return "B1:" + n; }

f(Object, int) è più specifico di f(A, long)?

Object <: A, no.

f(A, long) è più specifico di f(Object, int)?

A <: Object, vero
long <: int, falso, no.

Ne resta uno per cui incrociamo le dita.

f(A, int) è più specifico di f(Object, int)?

A <: Object, vero
int <: int, vero

f(Object, int) è più specifico di f(A, int)?

Object <: A, falso, no.

f(A, int) è più specifico di f(A, long)?

A <: A, vero
int <: long, vero.

f(A, long) è più specifico di f(A, int)?

A <: A, vero
long <: int falso, no.

Non essendoci metodi più specifici di f(A, int) questo sarà quello invocato.

Dunque se alfa è un riferimento ad un oggetto di tipo C, l'invocazione

alfa.f(beta, 3)

con beta := B e 3 := int, causerà l'invocazione di quello dei tre metodi in C che ha come parametri un A e un int. Il corpo di questo metodo stampa

B1:3

Nel caso in cui ci fossero metodi più specifici di f(A, int) allora o uno è Mandrake o piglia e si legge le specifiche perchè già chiedere 'sta roba è da fuori di testa, figuriamoci andare avanti.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2007, 09:20   #4
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
grazie a tutti e due, siete stati chiarissimi

ciao
__________________
HU Queen Member
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2007, 16:18   #5
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
invece in quest'altro esercizio:
Codice:
class A {
	public int f() { return 0; }
	public int f(A x) { return f() + 10; }
	}

class B extends A {
	public int f() { return 3; }
	public int f(B x) { return f() + 20; }
}

class C extends B {
	public int f(C x) { return 7; }
}

public class Test {
	public static void main(String[] args) {
		C gamma = new C();
		B beta = gamma;
		System.out.println(beta. f (beta));
		System.out.println(gamma.f(beta));
		System.out.println(211 > 523);
		System.out.println(74 & 1);
	}
}
perchè l'output è:
23
23
false
0

quando si chiama il metodo beta.f(beta), perchè viene richiamato il metodo public int f(B x) { return f() + 20; } della classe B, nonostante beta sia un oggetto di tipo C?
__________________
HU Queen Member
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2007, 19:25   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
La riassumo e parecchio.

"beta" è un riferimento di tipo B che punta ad un oggetto di tipo C.

Se non c'è quella che viene orrendamente definita "dereferenziazione", conta il tipo del riferimento e non dell'oggetto riferito.

In java l'unico caso in cui si prende in considerazione il tipo dell'oggetto e non del riferimento è quando si usi l'operatore "." per invocare un metodo.

C'è un punto? No, allora beta è un B. Se ci fosse un punto, seguito dal nome di un metodo, allora beta varrebbe come un C.

Dunque:

beta.f(beta)

vale come:

"il metodo f(B) appartenente al tipo a cui beta fa riferimento (C)"
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2007, 19:40   #7
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
scusa, ma il punto c'è quando invoco il metodo beta.f(beta), forse non ho capito la questione del punto?
__________________
HU Queen Member

Ultima modifica di mercury841 : 27-06-2007 alle 19:43.
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2007, 20:27   #8
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
beta.f(beta)

prima c'è "beta", poi c'è il punto, quindi sai che devi tener conto non del tipo del riferimento "beta" (che è B) ma del tipo dell'oggetto a cui punta (che è un C). Questo vale per sapere quali metodi possiede "beta".

Posto che qui si invoca uno dei metodi di C, qual'è questo metodo. Tocca fare la manfrina di prima.

E' un metodo che si chiama "f" e accetta un parametro di tipo:

beta, che è un B. Perchè non c'è il punto.

Ai fini della valutazione dei metodi posseduti, beta è un C. Ai fini della valutazione del tipo di parametro, lo stesso beta di prima è un B.

La classe C ha a disposizione tre metodi "f" applicabili, f(A), f(B), f(C). Dei tre è f(B) il più specifico, perchè il tipo di parametro con cui è invocato è B, e quindi è questo ad essere scelto

Naturalmente questo modo di dire "perchè non c'è il punto" non è propriamente tecnico, ma è per capirsi, per avere un appiglio visivo alla faccenda.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2007, 20:29   #9
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Ancora più esplicito. In beta.f(beta) ci sono due pezzi, uno col punto e uno senza:

beta. <- c'è il punto, vale come C
(beta) <- non c'è il punto, vale come B
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2007, 21:43   #10
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
ho capito, grazie, sei stato gentilissimo


ciao
__________________
HU Queen Member
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 11:03   #11
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
scusate ancora ma avrei un altro quesito. Il codice è questo:
Codice:
abstract class A {
	public abstract String f(A other, int n);
	public String f(A other, long n) { return "A:" + n; }
}

class B extends A {
	public String f(A other, int n) { return "B1:" + n; }
	public String f(Object other, int n) { return "B2:" + n; }
	public String f(B other, long n) { return "B3:" + n; }
}

class C extends B {
	public String f(B other, long n) { return "C1:" + n; }
	public String f(C other, int n) { return "C2:" + n; }
}
public class Test2 {
	public static void main(String[] args) {
		C gamma = new C();
		B beta = gamma;
		A alfa = gamma;
		System.out.println( alfa . f (beta, 4)) ;
		System.out.println( alfa . f (beta, 4L));
		System.out.println(beta. f ( (Object) alfa , 4)) ;
		System.out.println(gamma.f(gamma, 3));
	}
}
l'output di questo codice è:
B1:4
A:4
B2:4
C2:3

non riesco a capire perchè "System.out.println(alfa.f (beta, 4L));" stampa A:4 invece di B3:4.
In poche parole perchè invoca il metodo di "public String f(A other, long n) { return "A:" + n; }" nonostante beta sia di tipo B (senza punto)????
__________________
HU Queen Member

Ultima modifica di mercury841 : 28-06-2007 alle 11:05.
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 11:21   #12
lovaz
Senior Member
 
L'Avatar di lovaz
 
Iscritto dal: Jul 2002
Messaggi: 4334
Perche' alfa e' un riferimento di tipo A
lovaz è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 12:06   #13
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
Quote:
Originariamente inviato da lovaz Guarda i messaggi
Perche' alfa e' un riferimento di tipo A
scusa ma alfa non è un riferimento di tipo A che punta ad un oggetto di tipo C?
__________________
HU Queen Member
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 12:15   #14
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Credo che quella di lovaz sia una svista.

I metodi che devi considerare sono quelli posseduti dall'oggetto a cui punta il riferimento. Per l'invocazione di un metodo, alfa conta come C.

Comunque, per sapere cosa stampa è sufficiente che guardi il capitolo 15.12 delle specifiche del linguaggio di programmazione Java (The Java Language Specifications, 3th ed.)

Lì c'è scritto tutto il procedimento. E hai la certezza che sia descritto com'è veramente.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 12:54   #15
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
grazie, ciao
__________________
HU Queen Member

Ultima modifica di mercury841 : 28-06-2007 alle 12:57.
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 13:25   #16
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
FERMI TUTTI.

Ha ragione lovaz. Altro che svista.

Ho confuso la determinazione del metodo da invocare con il metodo invocato e mi chiuderò in una vergine di Norimberga per questo

E' chiaro. Il compilatore determina quale metodo collegare all'invocazione sulla base del tipo che vede durante la compilazione.

Il punto non c'entra una mazza con la compilazione

Ripeto: HO CONFUSO LA COMPILAZIONE CON L'ESECUZIONE.

Sempre guardare le specifiche prima di parlare, sempre.

Codice:
The first step in processing a method invocation at compile time is to figure out
the name of the method to be invoked and which class or interface to check for
definitions of methods of that name.
e poi:

Codice:
If the form is Primary.NonWildTypeArgumentsIdentifier...let T be the type of the Primary expression; then the class or interface to be searched is T
E il tipo di "alfa" è A, non C.

Le specifiche signori, le specifiche. Quelle bisogna guardare. Non fidatevi del primo Pirla-Bis che incontrate su un forum.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 13:26   #17
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
La teoria del punto! Macheccaz... i punti mi devo dare, cinquanta e sulla fronte.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 17:44   #18
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
cioè, fatemi capire perchè mi son perso...

nel primo esempio alfa puntava a un oggetto di tipo C e veniva invocato un metodo di C... ora no, perchè??

EDIT:
C eridita il metodo public String f(A other, long n) { return "A:" + n; } di A... quindi suppongo che venga invocato in quanto alfa punta a un oggetto di tipo C, ma non mi pare che tale metodo sia il più specifico in assoluto, data l'invocazione... non capisco

Ultima modifica di mad_hhatter : 28-06-2007 alle 18:01.
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 18:46   #19
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Il primo alfa è un A (in compilazione), ha un solo metodo applicabile, l'unico dichiarato, e il compilatore collega l'invocazione a:

f(A, int)

che è l'unico metodo noto.

Durante l'esecuzione si verifica la dereferenziazione (la teoria del punto ) e il metodo eseguito è la sovrascrittura di f(A, int) dichiarata in B ed ereditata da C.

La faccenda del metodo più specifico è valida ma opera dopo la determinazione di applicabilità dei metodi che è fatta rispetto ai metodi dichiarati nel tipo del riferimento e non nel tipo del valore a cui il riferimento punta. Che è l'esatto contrario della mia teoria del punt e mes
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 21:27   #20
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
ormai mi sono perso
__________________
HU Queen Member
mercury841 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico Lenovo IdeaPad Slim 3: un notebook Snapdragon X ...
Recensione OnePlus Watch 3 43mm: lo smartwatch che mancava per i polsi più piccoli Recensione OnePlus Watch 3 43mm: lo smartwatch c...
BOOX Note Air4 C è uno spettacolo: il tablet E Ink con Android per lettura e scrittura BOOX Note Air4 C è uno spettacolo: il tab...
Da 27,78€ a 56,99€: 5 accessori indispen...
3 minuti: è il tempo per vedere l...
Gli Amazfit sono ora gli smartwatch più ...
Rowenta alza la posta: scopa elettrica s...
6 robot per le pulizie completi in offer...
Friggitrice ad aria Cecofry Full InoxBla...
iPhone 16 Pro Max a 10€ in più del minim...
Una chiavetta USB, ma SanDisk Ultra Slid...
La bolla dell'AI: perché l'econom...
Lo smartphone dovrebbe essere usato solo...
SpaceX: i video e le foto dello spettaco...
Anche a Pescara si passa ai fatti: e-bik...
La One UI 8 è pronta: Samsung con...
Xiaomi annuncia l'arrivo in Italia dei R...
La Cina stupisce ancora: test per la tur...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:56.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v