Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
Analizziamo nel dettaglio DJI RS 5, l'ultimo arrivato della famiglia Ronin progettato per videomaker solisti e piccoli studi. Tra tracciamento intelligente migliorato e ricarica ultra rapida, scopriamo come questo gimbal eleva la qualità delle produzioni.
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D è la nuova CPU gaming di riferimento grazie alla 3D V-Cache di seconda generazione e frequenze fino a 5,6 GHz. Nei test offre prestazioni superiori a 9800X3D e 7800X3D, confermando la leadership AMD nel gaming su PC.
Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-06-2007, 19: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, 21: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 27-06-2007, 00: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, 10: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, 17: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, 20: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, 20: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 20:43.
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2007, 21: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, 21: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, 22: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, 12: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 12:05.
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 12: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, 13: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, 13: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, 13:54   #15
mercury841
Senior Member
 
Iscritto dal: Nov 2004
Messaggi: 409
grazie, ciao
__________________
HU Queen Member

Ultima modifica di mercury841 : 28-06-2007 alle 13:57.
mercury841 è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 14: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, 14: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, 18: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 19:01.
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 19: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, 22: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


DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
Xiaomi 17: ecco il prezzo europeo del to...
Google fa tremare l'industria dei videog...
Gli sviluppatori 'abbandonano' Xbox: il ...
Galaxy S27 Ultra, è già te...
PlayStation Portal con display OLED: Son...
POCO X8 Pro e Pro Max sono quasi pronti:...
OpenAI ha bisogno di nuovi fondi: NVIDIA...
Mese nuovo, rinnovo delle offerte Amazon...
Accessori auto imperdibili su Amazon: pu...
Gli utenti iPhone possono ridurre la pr...
Come fare affari con l'usato garantito d...
Il miglior tablet di tutta Amazon, DOOGE...
Gli smartphone in super offerta su Amazo...
Produttori di memoria più severi ...
WhatsApp Business, Meta introduce costi ...
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: 04:31.


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