|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2007
Messaggi: 393
|
[Java] Spiegazioni basilari
Salve a tutti, ho da poco incominciato a scuola la programmazione ad oggetti passando dal c al java, sto capendo ben più poco.
Ho cercato più volte di farmi spiegare dal prof bene come funziona la prog ad oggetti, però dopo mesi non capisco... Vi dico che io quando lavoravo in c ero tra i primi della classe (non per vantami, ma è solo per farvi capire che non ho basi) e ora non capirci niente mi scoccia tanto. Il casino penso che sia perchè ho cambiato il prof, ma ora non dilunghiamoci troppo e andiamo ai miei problemi: per prima cosa non capisco se il Java deve lavorare con più classi oppure se gliene basta una sola, a scuola noi di solito usiamo sempre 2 classi minimo e diciamo che secondo me incasina per le prime volte. secondo, scuola il prof ci ha fatto fare un programma che calcola dei punti x e y e fa le coordinate del punto, è un programma stupido, almeno in c lo saprei fare ad occhi chiusi ma qua mi incasino Prima classe Cordinate Codice:
class Cordinate { double x; double y; public Cordinate (double xi, double yi) { x=xi; y=yi; } public double getX() { return x; } public double getY() { return y; } } Cmq qua se ho capito bene si crea la classe, si inizializzano 2 variabili x e y e poi spuntano sti get, allora all'interno ci sono dei return, cioè ogni volta che noi richiamiamo il getX (per esempio) cosa succede? in c si usava o lo scanf o il cin e si leggeva l'input ma qua non capisco seconda classe Codice:
class Retta { static final int Dim=100; private Cordinate[] vett = new Cordinate[Dim]; public Retta(double k, double c, float step) { double xi = (double)-100*step/2; double yi; for (int i=0;i<Dim;i++) { yi=k*xi+c; vett[i]= new Cordinate(xi,yi); xi=xi+step; } } public Cordinate getCoordRett(int i) { if(i<1||i>100) return null; else return vett[i-1]; } } si inizializza la classe, si fa una variabile statica con static final che è la dimensione del nostro array,ed eccoci al mio incubo i COSTRUTTORI e soprattutto il new, non capisco a cosa servono, ed a new non ci trovo una minima logica, cioè si crea se ho capito un array Cordinate (Cordinate[]) da Cordinate[Dim]? Poi creiamo il metodo retta, con all'interno le 3 variabili, fin qua ho capito tutto tranne quel double tra parentesi. Il public Cordinate getCoordRett non ne ho la minima idea e infine l'ultimo Codice:
import java.lang.*; class TestRetta { public static void main(String[]args) { Retta r= new Retta(1.0,0.0,0.5f); for (int i=1;i<=100;i++) { if (i%5==0&&i!=0) System.out.println(r.getCoordRett(i).getX() +","+ r.getCoordRett(i).getY()); else System.out.print(r.getCoordRett(i).getX() +","+ r.getCoordRett(i).getY()+ " "); } } } Scusatemi se sono lungo e noioso, e se molti non vorranno leggere il tutto e spiagarmelo li capisco... ma se scrivo qua su queste cose è perchè dal mio prof non ho ancora capito... spero che possiate aiutarmi! ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
secondo me prima di tutto dovresti chiarirti bene cosa è la programmazione ad oggetti,al di là del linguaggio,il new serve proprio a creare un oggetto,che è un'astrazione di quello che tu vuoi rappresentare del mondo reale,infatti l'oggetto punto ha le sue coordinate,che poi tu andrai a cambiare ecc...con i metodi get,set ecc....ti consiglio di dotarti di un buon libro visto che i risultati della spiegazione del prof sono questi
__________________
Khelidan |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Dec 2007
Messaggi: 393
|
allora ma supergiù cos'è la programmazione ad oggetti l'ho capita, ma il new no, avevo capito che il new crea un oggetto, in questo caso un attributo (almeno spero, ho il terrore che sia la risposta sbagliata) però da cosa lo crea non capisco
per fare un esempio in C int Pincopallino[100]; così creo un array ma con il new non lo capisco |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
ma questo codice te lo hai scritto il prof?
__________________
Khelidan |
![]() |
![]() |
![]() |
#5 | ||||||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Certo che ci possono essere altri metodi. Ma è in base al "design" della classe che stabilisci quanti/quali metodi definire. In Java è tipico realizzare quelli che si chiamano "JavaBean", ovvero delle classi che per definizione, hanno delle "proprietà". Le specifiche JavaBean (a parte le questioni più complesse), dettano delle semplici regole a livello di denominazione dei vari metodi per definire come accedere alle proprietà (più altri per il listener ecc... ma tralasciamo). Ad esempio la regola è che se la classe ha una proprietà "nome", allora ci può essere un metodo getNome e uno setNome. Se la proprietà è di tipo String, i metodi saranno: public String getNome() { .... } public void setNome(String n) { .... } Quote:
Se vuoi chiedere in input qualcosa all'utente, devi usare classi e metodi di I/O appositi. Ti chiedi che succede con getX(). Se hai creato un oggetto di tipo Cordinate (creato passando nel costruttore i due valori), invocando il getX() su quell'oggetto ottieni semplicemente il valore della proprietà 'x' di quell'oggetto. Tutto qui. Non centra nulla con interfacce utente o altro. Quote:
Comunque quel: private Cordinate[] vett = new Cordinate[Dim]; è corretto. Gli array sono degli oggetti e vanno pertanto istanziati. Quella è la forma corretta per istanziare un array di 'Dim' elementi. Nota che l'array contiene inizialmente 100 null. Non hai creato 100 oggetti di tipo Cordinate, hai solo creato un array che contiene 100 locazioni di tipo reference Cordinate. Quote:
La classe Retta contiene 100 coordinate. Al metodo getCoordRett si passa un indice (è 1-based ma non importa) che permette di restituire la coordinata i-esima richiesta. Quote:
Il new serve sempre per istanziare un oggetto. Quelli dopo new Retta?? Sono gli argomenti che vengono passati al costruttore.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 01-04-2008 alle 22:25. |
||||||
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 384
|
Allora la OOP cerca di riflettere le cose così come sono nel mondo reale ovvero un insieme di oggetti che comunicano tra loro per risolvere un problema (esepio idiota: un pc è formato da più oggetti semplici che dialogano tra di loro per svolgere un determinato compito)
Questi oggetti tuttavia non sono definiti uno per uno, si definiscono invece le caratteristiche (le proprietà o attributi che poi sono la stessa cosa delle variabili della procedurale) e le funzionalità che l'oggetto offre (metodi che sarebbero le funzioni della procedurale funzioni). Per esempio per creare un oggetto motocicletta non si crea la motocicletta avente il colore rosso, di marca x e targa y ma si crea la classe che fa da modello astratto: quindi si crea una classe che abbia al suo interno un attributo per il colore, uno per la targa e uno per le ruote. Tali attributi se non venissero inizializzati non si potrebbe usare la classe o meglio: non viene generato nessun errore, però pensa di avere una motocicletta senza serbatoio... Il costruttore serve proprio a questo: a inizializzare gli attributi della funzione. Per quanto riguarda il main banalmente: in Java in tutto è una classe e quindi anche il main (che è una funzione) deve essere inglobato in un oggetto.... la sua definizione è quella da te postata (in pratica ci devono essere necessariamente gli attributi public e static) Spero di esserti stato utile ![]() ciao |
![]() |
![]() |
![]() |
#7 | ||||
Member
Iscritto dal: Sep 2007
Messaggi: 207
|
cerco di aggiungere quello che non ti e' stato spiegato ancora in base alle tue richieste, cmq ti consiglio pure io un buon libro di introduzione vedi topic relativi.
come ti hanno già detto giustamente la classe rappresenta l'astrazione di quello che vuoi rappresentare e l'oggetto la sua concretizzazione,da quì il termine istanziare la classe e' come definire una classe Persona per poi creare oggetti di tipo Persona con nome marco luca etc...(il nome sarebbe appunto l'attributo) scusa se magari divento pignolo,forse ti sei espresso male te e non c'e' bisogno di spiegazione, ma penso sia cmq piu corretto correggerti qui : Quote:
Quote:
per quanto riguarda lo static probabilmente essendo passato da poco dal C sarai abituato a pensare in C e non in Java... una variabile statica in C come sai gia e' una variabile la cui visibilità e' ristretta al blocco di codice nella quale viene dichiarata ma la sua esistenza in memoria rimane fino alla chiusura dell'applicazione(e' come una global ma a scope limitato per le var locali) se dichiari una variabile locale e statica in un blocco {...} (qualunque sia la funzione o procedura relativa) quella variabile e' raggiungibile solo da quel blocco,ovviamente richiamando quel blocco piu di una volta ogni volta che viene letto o aggiornato il valore bisogna sempre tener conto che la variabile non viene mai distrutta percio il suo valore non viene mai perso se dichiari una variabile globale statica la variabile sarà accessibile solo da quel file in Java invece e' differente, prima di tutto essendo il paradigma differente si chiama membro statico sia esso un attributo o metodo.(le variabili all'interno dei metodi non possono essere statiche perchè non sono ne attributi ne metodi) se un membro e' statico significa che può essere accessibile senza dover per forza istanziare la classe a cui appartiene, ovvero non hai bisogno di un oggetto attivo(oggetto che ha istanziato la classe) Quote:
Codice:
System.out.println(Retta.Dim); //codice lecito in quanto e' un membro statico fare : Codice:
System.out.println(Persona.getNumFingers); mi e' piu semplice ora spiegarti che un membro statico e' un membro di classe e non di oggetto, se dichiari un membro statico tutte le istanze della classe contente tale membro lo condivideranno(e' unico per tutte le istanze, di fatti tutte le persone che puoi creare nel tuo programma hanno un unico metodo getNumFingers() ....e spero restituisca sempre 5 ![]() ![]() ![]() questo e' il motivo credo per il quale il main che sarebbe l'entry point dell'applicazione deve essere implementato statico, poiche la JVM non istanzia la classe principale (ovvero quella nella quale hai definito il main) per eseguire il tuo programma ma esegue, appunto, senza l'ausilio di oggetti attivi il main e deve essere pubblico perchè lo fa al di fuori dalla classe nella quale viene definito ...purtroppo a riguardo non sono mai riuscito a trovare conferma in nessun libro o da professori ma credo sia per logica cosi. per finire il costruttore. non sono un incubo dopo di tutto ![]() quando istanzi una classe il costruttore e' una procedura(la definisco tale in quanto non restituisce nulla) che rappresenta l'inizio del ciclo di vita del tuo oggetto e serve in molti casi ad inizializzarlo[in altri linguaggi come il c++ c'e' anche un distruttore che rappresenta la propria fine prima di essere distrutta] nel caso di prima se definisco la classe Persona come: Codice:
class Persona{ public String nome; } creo un oggetto Studente1 ma senza nome,perche inizialmente non viene inizializzato il relativo attributo se invece : Codice:
class Persona{ public String nome; public Persona(String nomeP){ nome = nomeP; } } creo una persona passando la stringa "Luca" al costruttore che assegna essa(la stringa "Luca") al membro pubblico nome percio si puo dire che creo una persona di nome Luca.prova a debuggare il programma per vedere come il flusso di codice viene eseguito. spero di non aver scritto castronerie e di averti piu o meno fatto capire un po di cose EDIT:PS: Quote:
Ultima modifica di m.distrutti : 02-04-2008 alle 07:45. |
||||
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
inizialmente potresti vedere gli oggetti come delle semplici struct che possono contenere anche funzioni (metodi) oltre a variabili (attributi). in questo modo è possibile invocare un metodo appartenente all'oggetto.
ma gli oggetti sono molto di più di questo ![]() passando a cose più pratiche.. la new in pratica è l'equivalente di malloc, solo che in java non viene esposta al programmatore tutta la parte relativa alla gestione della memoria, poichè (quasi sempre) se ne occupa java in automatico. ma oltre ad allocare memoria la new invoca anche (immediatamente e in automatico) il costruttore dell'oggetto, motivo per cui le new hanno dei parametri (se i costruttori richiedono parametri). |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
Il professore attuale non ha alcuna colpa. Il vero problema è che hai iniziato a programmare col linguaggio peggiore esistente per iniziare. questo thread lo metterei in rilievo in modo che finalmente tutti capiscano che iniziare col c è la scelta peggiore in assoluto. Cmq io ti consiglierei vivamente di studiare BENE come funziona la programmazione ad oggetti e di cercare di cancellare tutto quello che hai imparato col c.
__________________
![]() |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
Quote:
|
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jun 2001
Messaggi: 458
|
Ciao Alemix, ti consiglio di leggere "Object Oriented && Java 5 - II edizione": scaricabile al seguente indirizzo: http://www.claudiodesio.com/ (...il libro è in italiano
![]() Letto con tranquillità dall'inizio, toglie tutti i dubbi. ![]()
__________________
Ultima modifica di vincenzo83 : 02-04-2008 alle 10:59. |
![]() |
![]() |
![]() |
#12 | |
Member
Iscritto dal: Sep 2007
Messaggi: 207
|
Quote:
quoto ![]() |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Dec 2007
Messaggi: 393
|
Ragazzi, vi devo ringraziare esageratamente (per chi diceva che non era il prof penso che si sia sbagliato
![]() Purtroppo il mio cervellino funziona via pratica e non con la teoria... io ho studiato da inizio novembre la teoria del OOP, senza capire, ma ora spiegandomi cosa fa quel programma sto capendo, quindi cominciamo a rispondere. tante cose che ho scritte, le ho scritte di corsa e male (non che poi io sia una cima in Italiano ![]() khelidan1980, si lo ha scritto il prof per tutta la classe siccome non riuscivamo a farlo ![]() la questione degli oggetti l'avevo capita (almeno quella) cioè sapevo che erano diversi dalle solite variabile, ma io le avevo prese come un mezzo miscuglio tra funzioni o procedure e record. Allora ho capito il set e il get cioè in poche parole noi creiamo in set x, e poi in get gli assegniamo un valore, ma il valore quando se lo prende, cioè spieghiamoci meglio, se non ho capito male x diventa xi... ma quando c'è questo passaggio? e poi, se noi non diamo ad un attributo un numero, tipo 50 come facciamo a sapere che valore ha? e altra cosa Codice:
for (int i=0;i<Dim;i++) { yi=k*xi+c; vett[i]= new Cordinate(xi,yi); xi=xi+step; } } Per la questione del main avevo capito giusto ma mi ero espresso male. Il new invece continuo a nn capire, il concetto teorico l'ho capito cioè i faccio new e la virtual machine mi alloca dello spazio in memoria ma prendiamo questo caso: private Cordinate[] vett = new Cordinate[Dim]; il private sta per privato, cioè che è "nascosto" Cordinate[] sta per la classe? vett non so, il simbolo si = mi da pensare che sia un assegnamento, e Cordinate[Dim] è l'array Per ora direi basta domande, poi massimo chiedo dopo ![]() ora do un occhiata a quel libro, ma un buon libro cartaceo completo? che se è me lo prendo! |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
il libro è sia in versione cartacea sia scaricabile liberamente online,è davvero un bel libro lo usate anche io!
Per la questione del new,tu hai capito semplicemente il concetto a basso livello,cosa che a te non interessa,cosa fa veramente new non lo hai capito,perchè ancora non hai chiaro il paradigma ad oggetti....hai una confusione bestiale in testa e a parer mio è l'esempio lampante,come dicono anche tanti altri più qualificati di me qui,che insegnare il C come primo linguaggio è quanto di più sbagliato ci sia!
__________________
Khelidan |
![]() |
![]() |
![]() |
#15 | |
Member
Iscritto dal: Sep 2007
Messaggi: 207
|
Quote:
Codice:
private Cordinate[] vett = new Cordinate[Dim]; con l'istruzione : vett[i]= new Cordinate(xi,yi); inizializzi vett[i] come oggetto attivo e passi al costruttore i parametri xi yi ![]() EDIT: come dici te il new giustamente alloca in memoria, nel primo caso alloca un numero di reference non inizializzati, nel secondo caso alloci un oggetto attivo passando il flusso di codice al proprio costruttore >_<' sta cominciando a diventare una cosa personale farti capire il tutto >_< Ultima modifica di m.distrutti : 02-04-2008 alle 19:53. |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Dec 2007
Messaggi: 393
|
ihih, lo sto cominciando a pensare pure io
![]() Però tornando al libro, ho visto che c'è quello cartaceo, lo sto scaricando e poi lo leggo, però mi servirebbe da portarmelo a scuola e sopratutto per non usare 500 fogli e litri di inchiostro per stamparmi le pagine Cmq siccome mi avete detto che non ho capito il new, me lo potete spiegare ![]() |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
tento di spiegarte prescidendo dal linguaggio ma conta che qui c'è gente molto piu brava che te lo spiegherà,il new serve per instanziare un oggetto....ora hai capito cos'è un oggetto?E che relazione ha con la classe?
__________________
Khelidan |
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Visto che conosci il C, facciamo un paragone, anche se non perfetto. Una classe la puoi paragonare ad una struttura. Es. Codice:
struct prova { int var1; int var2; }; Quando invece definisci una variabile, es: Codice:
int main (void) { struct prova miavar; .... } Quando in Java hai definito la classe Cordinate, non hai allocato un bel nulla, proprio come per le strutture. Codice:
class Cordinate { .... } Se le variabili di istanza non sono "troppo" protette (es. private), potresti anche fare: Cordinate c = new Cordinate(....); System.out.println (c.x); La vedi la similitudine con le strutture??? Tutto qui.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Dec 2007
Messaggi: 393
|
ahh capito, ho confuso le variabili con gli attributi... cioè io facevo il paragono tra attributi e variabili diciamo, e infatti non capivo... se ho compreso bene ho:
CLASSE che è la classe dove io lavoro es: class Prova{...} METODI che è la parte dove io eseguo qualcosa es class Prova { if(i=0) else } ho fatto un esempio stupido senza inizializzare niente ATTRIBUTI che è la parte dove inizializzo le variabili class Prova { public Prova p = new Prova; } attiributi e metodi stanno sullo stesso piano e poi o le variabili infondo Ditemi che ho capito ![]() |
![]() |
![]() |
![]() |
#20 | ||
Member
Iscritto dal: Sep 2007
Messaggi: 207
|
Quote:
Quote:
![]() in java e' cosi : Codice:
class nomeClasse{ int attributo; //gli attributi stanno qui public nomeClasse(){ //costruttore che ha lo stesso nome della classe non specifica nessun tipo //di ritorno (ne void ne nient'altro per distinguersi dal resto) } void metodoVoid(){ //*******EDIT******* int variabile //********************** if(...){ ........ } }//metodo che non restituisce nulla int metodoInt(){ ....... return attributo; }//metodo che restituisce un valore int } le variabili sono i dati che dichiari all'interno dei metodi o costruttore,anche i parametri passati... gli attributi sono i dati dichiarati fuori dai metodi ma dentro la classe ![]() EDIT:cmq e' inutile spendere 2000 post perche mi sembra chiaro che non hai molto le idee chiare >.<,se vuoi posso anche risponderti ma non vorrei confonderti le idee penso sia piu esaustivo e preciso un libro o un ricevimento con il professore Ultima modifica di m.distrutti : 02-04-2008 alle 20:59. |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:56.