View Full Version : [JAVA] Domanda facile da newbie
andrew1988
24-08-2009, 23:54
sto studiando ora java e sn veramente alle prime armi e m sn imbattuto in classi metodo oggetti.. domanda.
System.out.println(new Rectangle().getWidth());
il risultato e' che stampa a terminale la larghezza del rettangolo, ovvero 0.. ma
io ho capito che viene costruito un oggetto tramite il costruttore Rectangle e col metodo getWidth() ne viene restituita la larghezza.
1) i metodi si applicano agli oggetti presenti in una determinata classe.. in questo esempio come fa a sapere in che classe si trova quel metodo?
2) passata quella istruzione, l'oggetto creato risiede ancora in memoria oppure nn essendo associato a nessuna variabile viene automaticamente liberato lo spazio?
thx
Frank1962
25-08-2009, 00:36
sto studiando ora java e sn veramente alle prime armi e m sn imbattuto in classi metodo oggetti.. domanda.
System.out.println(new Rectangle().getWidth());
il risultato e' che stampa a terminale la larghezza del rettangolo, ovvero 0.. ma
io ho capito che viene costruito un oggetto tramite il costruttore Rectangle e col metodo getWidth() ne viene restituita la larghezza.
1) i metodi si applicano agli oggetti presenti in una determinata classe.. in questo esempio come fa a sapere in che classe si trova quel metodo?
2) passata quella istruzione, l'oggetto creato risiede ancora in memoria oppure nn essendo associato a nessuna variabile viene automaticamente liberato lo spazio?
thx
la prima domanda non l'ho capita ...cioè tu scrivi Rectangle e il compilatore quando và a cercare quella classe vede che nella dichiarazione è presente anche il metodo "getWidth()"; la risposta della seconda domanda invece è si, viene liberato lo spazio immediatamente essendo che l'istanza dell'oggeto Rectangle non ha nessun referenziazione che tu possa utilizzare successivamente.
andrew1988
25-08-2009, 00:44
scusa ma Rectangle() e' una classe o un costruttore (appartenente alla classe Rectangle)?
Frank1962
25-08-2009, 01:04
scusa ma Rectangle() e' una classe o un costruttore (appartenente alla classe Rectangle)?
il Rectangle() di cui ti rieferisci è semplicemente il codice che richiama il costruttore della classe interessata ...e questo lo capisci dal fatto della keyword new (keyword (http://www.lattecafe.net/java/articoli/javakeyword.htm)) presente davanti al nome "Rectangle" della classe che stai istanziando ;)
nuovoUtente86
25-08-2009, 01:04
Una classe (composta da variabili e metodi) rappresenta il modello di un' entità nel dominio del problema in esame. In quest caso parliamo di figure geometriche, se approntiamo un software per la gestione di esami universitari avremmo una classe Studente (erede presumibilmente di Persona) e cosi via...
Gli oggetti, invece, sono istanze specifiche di una determinata classe in cui le peculiarità del modello (classe) hanno un valore ben preciso (lo studente Mario Rossi matricola 3000 è un' istanza della classe Studente).
Tornando ai tuoi dubbi un oggetto occupa spazio in memoria, secondo la "formattazione" stabilita dalla classe. Nel caso specifico di java (che è un linguaggio managed) tale memoria viene deallocata dal garbace collector(che di solito sfrutta i cicli idle della cpu), secondo specifici algoritmi, qualora non sussistano più riferimenti (proprio come nel tuo caso).
andrew1988
25-08-2009, 01:35
grazie ad entrambi..
altra domanda.. se importo 2 classi.. e in entambe le classi c'e' un costruttore che fa cose diverse ma con lo stesso nome.. quando io vado a creare un oggetto con quel costruttore cosa succede?
Frank1962
25-08-2009, 01:46
grazie ad entrambi..
altra domanda.. se importo 2 classi.. e in entambe le classi c'e' un costruttore che fa cose diverse ma con lo stesso nome.. quando io vado a creare un oggetto con quel costruttore cosa succede?
quindi deduco che se queste classi hanno uno costruttore con lo stesso nome anche il nome della classi deve'essere uguale (come vogliono le specifiche Java) ...ergo l'ambiguità verrà risolta con la keyword import che definirà la gerarchia del package che contiene la classe che realmente vuoi utilizzare.
giusto in questo momento stò usando una classe di nome "Login" ....Eclipse, che è un IDE che aiuto a scrivere del codice, si è accorto della ambiguità è mi ha domandato che import volesse che aggiungessi tra i package a cui risultava essere presente la classe di nome Login (nel mio caso il package "webserver" e quello di Oracle "oracle.jdbc.util") in modo si risolvesse il problema.
edit:
se invece vuoi per forza usare due classi con lo stesso nome allora devi usare i fully qualified name come ti ha spiegato il nuovoUtente quà sotto :D
nuovoUtente86
25-08-2009, 01:47
Devi utilizzare i fully qualified name .
Immagina di definire in un tuo package la classe Vector e di fare qualcosa del genere
import miopackage.*;
import java.util.*;
public MiaClasse {
java.util.Vector v; //in questo caso utilizzi la classe standard.
}
andrew1988
25-08-2009, 02:16
si esatto intendevo proprio il caso descritto da nuovoutente86.. in quel caso riesco ad usare quei due cosi in una classe unica facendo distinzione riguardo alla provenienza dei cosi.. e x cosi intendo metodi o costruttori presenti in una classe importata.. sisi mi pare un'ottima soluzione
nuovoUtente86
25-08-2009, 02:31
Attenzione al fatto che solo i metodi statici (sono solitamente quelli non peculiari alla singola istanza, non dipendenti dallo stato....immaginale come funzioni del C). Un esempio è Integer.parseInt(String) che preso un input restituisce un risultato senza dipendenza da un particolare oggetto.
Diversi sono i metodi d' istanza che possono essere invocati solo su oggetti attivi, come ad esempio il mutatore di residenza per una persona.
Persona p= new Persona (................);
p.setIndirizzo("bla bla bla");
andrew1988
25-08-2009, 02:45
si infatti avevo letto giusto prima sul libro d java che tipo il metodo main era static xke' nn aveva alcun oggetto su cui "appoggiarsi" in quanto e' la prima cosa ad essere eseguita senza che nessun oggetto sia creato... xo' in effetti questo paragone con la funzione in C m chiarisce molto meglio le idee
andrew1988
25-08-2009, 17:54
mi potreste spiegare in modo facile cos'e' una interfaccia? magari con un esempio..
leggo sul libro ma nn ci capisco nnt..
io ho capito questo ditemi se va bene:
creo una classe con determinati medoti.
creo una interfaccia con altri metodi.
creo un oggetto appartenente alla classe la quale potra' essere gestita con i medoti della classe, ma se poi voglio renderla disponibile ad un utente allora posso assegnare l'oggetto all'interfaccia in modo tale che questo nuovo oggetto avra' metodi dedicati per un utilizzo magari + ristretto rispetto a quelli che la classe di partenza mi garantiva
giusto?
morskott
25-08-2009, 20:50
Un'interfaccia è in pratica un "contratto" che tu "stipuli" con l'utilizzatore, in pratica tu dici "io ti garantisco questa semantica, poi come viene gestita son fatti miei".
Quindi tu definisci un'interfaccia e una classe che implementa quell'interfaccia, chi userà il tuo componente utilizzerà l'interfaccia (per la creazione dell'istanza si può fare tramite factory (http://www.oodesign.com/factory-pattern.html)) e quindi non saprà niente sulla reale implementazione di quel che sta usando.
Per esempio un canale di comunicazione, l'interfaccia sarebbepublic interface Canale{
public void connetti(Destinazione dest); //Destinazione sarà una classe che rappresenta l'end-point a cui connettersi
public void manda(Messaggio mes); //Messaggio classe che rappresenta il messaggio
public Messaggio ricevi(); //ipotizzo un utilizzo il cui il client chiede in pooling se ha ricevuto un messaggio
public void chiudi();
}Come vedi quest'interfaccia modella (molto semplicemente) il comportamento di un canale di comunicazione, quello che uno ci può fare. Poi ci sono tanti modi di implementarlo.
nuovoUtente86
25-08-2009, 21:11
In Java il concetto d' interfaccia nasce, per lo piu, dal sopperire al mancato supporto all' ereditarità multipla.
Come ti è stato già detto un' interfaccia espone (attraverso la firma dei metodi disponibili) un contratto vincolante per l' implementatore e fruibile trasparentemente (indipendentemente da quale sia la reale implementazione dei metodi) dall' utilizzatore.
Una classe che implementa un' interfaccia si impegna ad implementarne (eventualmente lasciandone il corpo vuoto) tutti i metodi.
Altresi un' interfaccia (che può estenderne un' altra)non può essere istanziata ma può referenziare un oggetto istanza di una classe che la implementa.
Comparable c= new Comparable() // non è ammesso
Comparable c= new MiaClasseComparabile(); // si, a patto che la classe implementi Comparable.
andrew1988
25-08-2009, 22:57
leggendo cosi' velocemente ho compreso il senso delle interfacce ma nn bene come si costruisce.. ora dv andare e domani mi leggo quelle cose con + cura e dedizione.
cmq grazie siete gentilissimi!
In Java il concetto d' interfaccia nasce, per lo piu, dal sopperire al mancato supporto all' ereditarità multipla.
A uno dei progettisti di Java (Ken Arnold) una volta chiesero cosa avrebbe lasciato fuori se avesse potuto. La risposta fu "le classi".
L'interfaccia, il cui significato è quello già citato di contratto puro, è il cuore del linguaggio di programmazione Java.
banryu79
26-08-2009, 11:26
Quoto.
Non è che "In Java il concetto d' interfaccia nasce, per lo piu, dal sopperire al mancato supporto all' ereditarità multipla" ma è proprio per la scelta di trovare un'alternativa che non comportasse i tipici problemi che sorgono con l'ereditarietà multipla tra classi, il motivo che ha portato alle interfacce.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.