Informatică, întrebare adresată de GeorgeDINFO, 9 ani în urmă

Salut! Vroiam sa va intreb am inceput sa invat java din cartea java de la 0 la expert. SI am ajusn la capitolul cu instante dar nu am inteles in carte ce este o instanta.
Am facut un program si am incercat sa imi dau seama singur cam ce este o instanta :
am facut o clasa cu diferite instante
class Exemplu{
int x;
Exemplu(){
System.out.println("constructor fara parametri");
}
Exemplu(int x){
this.x=x;
}
static Exemplu primulX=new Exemplu(1);
public void setX(int X)
{this.x=x;
}
public String toString()
{
return "x="+x;
}}

SI programul java
public class DiferiteInstante {
public static void main (String [] args)
{
System.out.println("primulX:"+Exemplu.primulX);

Exemplu obiectDoi=null;

try
{
obiectDoi=(Exemplu)
Class.forName("Exemplu").newInstance();
System.out.println("obiectDoi:"+obiectDoi);
obiectDoi.setX(2);
System.err.println("obiectDoi:"+obiectDoi);
}
catch(Exception e)
{System.out.println(e);
}
Exemplu obiectTrei=new Exemplu(3);
System.out.println("obiectTrei:"+obiectTrei);
}
dar la compilare apare
C:\Users\Admin\Desktop>cd JAVA PROGRAMS

C:\Users\Admin\Desktop\JAVA PROGRAMS>javac Exemplu.java

C:\Users\Admin\Desktop\JAVA PROGRAMS>javac DiferiteInstante.java

C:\Users\Admin\Desktop\JAVA PROGRAMS>java DiferiteInstante
primulX:x=1
constructor fara parametri
obiectDoi:x=0
obiectDoi:x=0
obiectTrei:x=3

C:\Users\Admin\Desktop\JAVA PROGRAMS>

De ce obiectul 2 este 0 stiu ca primul obiect doi atat trebuie sa ne dea dar al doilea ar trebui sa fie 2 ca am pus setX(2)

Imi poate spune si mie fiecare rand din program ce vrea sa insemne va rog? Eu stiu c++ si am asociat oarecum instante cu parametri unei functi e bine?


Deby11111: NU ARE SENS NIMIC
AntiEaglesDavids: incearca sa indentezi si tu codu ca nu se intelege mare lucru. Foloseste pastebin si pune linku aici (intreaba mai intai un moderator daca ai voie).
AntiEaglesDavids: eu unul stiam ca instanta este acelasi lucru ca si un obiect (desi nu sunt sigur daca terminologia este la fel si pt java)
AntiEaglesDavids: de ex: Casa casaMica = new Casa() unde "Casa" este clasa iar "casaMica" este o instanta a clasei "Casa" (adica un obiect)
AntiEaglesDavids: adica este ceva concret
blindseeker90: Poti sa pui ambele declaratii de clase in acelasi fisier si sa-l numesti "DiferiteInstante" Intr-un fisier sursa, trebuie ca o singura clasa sa fie declarata publica si fisierul sursa trebuie sa poarte denumirea acelei clase.

Răspunsuri la întrebare

Răspuns de blindseeker90
1
O clasa este o schema sau un plan dupa care iti creezi un anumit obiect. O clasa are intotdeauna un constructor: acel constructor iti spune cum va arata minimum un obiect. Daca ai face un constructor despre un om, ai spune ca minimum este un mamifer din specia primatelor cu degete mari opozabile. Dar in acelasi timp daca te intereseaza doar faptul ca e primata sau mamifer atunci ai avea alte definitii pentru om: naste pui vii, are capacitatea de a se catara cu usurinta in copaci, este omnivor, oricare dintre aceste calitati. Ei bine, constructorii clasei iti pot da aceste definitii

Tu ai clasa Exemplu. Primul constructor daca te uiti nu are nici un fel de parametru(valoare intre paranteze) deci va afisa doar un mesaj atunci cand faci o referinta la el. Exemplu()
Al doilea constructor preia o valoare numerica de la instanta unde este apelat, si seteaza o proprietate de-a sa cu acea valoare. In cazul omului, poti sa spui ca acel x este greutate, sau inaltime, clasa principala poate sa  modeleze astfel obiectul respectiv
Prima instanta creata este cea statica din clasa Exemplu. Hai sa ne uitam la aceasta linie
static Exemplu primulX=new Exemplu(1);
static este on modificator care iti spune ca orice obiect derivat din aceasta clasa va avea aceasta instanta.
Exemplu iti spune ca instanta creata este pentru clasa Exemplu
primulX este numele instantei care este de fapt o REFERINTA la un obiect al clasei Exemplu. Toate obiectele sunt deja create si sunt descrise de clasa. Tot ce face aceasta referinta este sa iti indice locul in care se afla obiectul in memorie
new Exemplu(1) creeaza un obiect dupa descrierea clasei cu ajutorul constructorului. Observi constructorul folosit este de forma Exemplu(1) deci spune ca el vrea un obiect cu campul respectiv=1
Desi citesti de la stanga la dreapta, de fapt ordinea de executie este de la dreapta la stanga: mai intai creeaza un obiect nou cu campul=1 si apoi creeaza o referinta catre el cu numele primulX. Este exact acelasi sistem cum pe mine ma cheama Blindseeker, dar stii ca in spatele acestui nume este un obiect numit om. Mai intai obiectul este creat, si apoi i se da un nume.
ToString este doar o metoda care iti spune cum sa tiparesti obiectul atunci cand este pus intr-o instructiune de tiparire(cum ar fi println)
Si atunci in clasa principala(care este singura publica, orice arhiva de clase are o singura clasa publica, accesibila de utilizator si alte softuri)
diverse instante sunt create. In prima linie apare primulX: x=1 pentru ca functia toString afiseaza "x="+x unde + inseamna concatenare, iar x este valoarea setata. Tu ai setat direct cu 1 in clasa, deci asta este.
Observi la instanta statica faptul ca este direct accesata, fara sa i se dea o referinta in cadrul clasei DiferiteInstante. Asta pentru ca orice clasa externa trebuie sa stie de aceasta instanta. Cum ar fi de exemplu Adam pentru oameni: este parintele biblic al tuturor oamenilor, indiferent ce proprietati au ei, si va fi pe vecie, deci este static.
Apoi ai o declaratie interesanta pentru ca legi o referinta de o instanta nula
Exemplu ObiectDoi=null; Nul inseamna ca referinta nu duce catre nimic, si instanta nula este comuna tuturor claselor
Apoi creezi inca o instanta intr-un mod mai putin ortodox
(exemplu) Class.forName("Exemplu").newInstance();
(exemplu) face conversia fortata a instantei in clasa Exemplu. Sa tii minte: noi am declarat referinta ObiectDoi catre clasa Exemplu, dar nu am declarat si instanta de tip exemplu
Class.forName identifica o clasa dupa numele sau si primeste un parametru de tip string cu numele clasei, adica Exemplu.
newInstance() este o metoda a acelei clase care iti creeaza instanta cu un constructor fara parametri.
Deci toata nebunia asta este echivalenta cu:
obiectDoi=new Exemplu(); si asa o scriu majoritatea oamenilor normali la cap
Dar cand folosesti acel constructor, in mod automat afisezi mesajul "Constructor fara parametri" de aceea apare a doua linie
Apoi iar folosesti println cu obiectDoi si toString cu "x="+x. Si vezi ca apare x=0 Asta se intampla pentru ca noi nu avem nici o valoare data lui x(nici prin constructor nici prin setX) si atunci Java in mod automat ii da o valoare default, care pentru int este 0.
Apoi setezi variabila x=2 cu metoda SetX
Si atunci cand faci afisarea din nou cu toString apare "x="+x adica x=2
Si mai departe folosesti exact constructorul folosit si la instanta statica si afisezi mesajul clasic co println si toString

AntiEaglesDavids: frate...
GeorgeDINFO: Buna scuze ca raspund asa tarziu.Vroiam sa iti multuemsc mult pentru toate informatile care mi le-ai dat .Vroiam doar sa te intreb pentru a consolida niste cunostite.Instanta este o referire la clasa unui obiect.Si expresia String toString e echivalenta cu System.out.println() .Cand am compilat nu stiu de ce dar cand am dat lui x variabila 2 cu metoda setX mi-a aparut 0 si nu stiu de ce.Dar in final concret ce este o instantamobiect.
Răspuns de antonii
1
Nu am programat in java pana acum insa stiu sa lucrez pe limbajele OO (object oriented). Dau o definitie scurta: clasa reprezinta modelul(pattern-ul) dupa care este construit/folosit un obiect(instanta). Nu ai control absolut asupra obiectului decat prin functiile/metodele,variabile ,events puse la dispozitie de clasa.
   De exemplu sa spunem ca vrei sa faci o aplicatie pentru scoala care sa poata face cateva operatii pe clasa(media generala a clasei,un tabel cu elevii clasificati in functie de medie,etc.) Insa in scoala ai mai multe clase. In acest caz poti (sunt o multime de metode pentru a rezolva acest lucru chiar si cu structuri) sa creezi o "clasa" care sa prezinte functionalitatile de care ai nevoie.
     Aceasta clasa va contine un vector (C++) de structuri (C++) in care se vor inmagazina numele elevului si media. Apoi creezi niste functii pentru clasa care sa calculeze:care este media cea mai mare din vectorul din clasa,etc. .
     Apoi cand ai terminat clasa trebuie sa creezi niste instance/obiecte ale clasei. (e si logic....ai creat numai o clasa cu un singur vector. Nu poti stoca mai multe clase din scoala ta in aceea clasa. Deci altul e scopul clasei.Trebuie sa-i creezi niste instante. Te poti gandi la acestea ca la niste dublicates).
      Acum cand vrei sa adaugi o clasa din scoala ta creezi o noua instanta a acelei clase si pui in vectorul instantei nou-create elevii din clasa ta(din scoala). E destul de simplu. 

blindseeker90: In primul rand, tocmai ai facut o comparatie intre un limbaj de programare(Java) si limbajele pentru un intreg framework(.NET). Exista si limbaje exclusiv procedurale in .NET care folosesc doar seturi,liste si dictionare, precum TSQL pentru baze de date sau versiuni de IronPython sau chiar C. Poate vrei sa compari Java cu C#, care este tot un limbaj orientat pe obiecte.
blindseeker90: Si oamenii care programeaza in aceste programe citesc carti de baza: ei trebuie sa invete cum se face distribuirea obiectelor in heap, cum se acceseaza mai repede, cum pot sa faci ierarhia de clase, cum se fac implementarile de interfete si ce modele de patternuri se construiesc. Carti de specialitate sunt cele care sunt concentrate doar pe un domeniu(exemplu Java Mobile, Java Security, Java Web Development), dar cartile de baza despre elementele limbajului sunt foarte dificile.
blindseeker90: Eu ti-am sugerat sa citesti acea carte dintr-un motiv simplu: este evident ca nu stii ce face mai exact codul postat, te duci pe exemple de c++ pentru a explica ceva ce comentatorul vrea sa stie pentru Java, si exemplul tau nu are legatura cu modul in care sunt create instantele cu constructori in Java. Deci raspunsul tau e complet irelevant pentru ce isi doreste el.
antonii: Cu privire la acea comparatie cu .net: ma gandeam sa nu fac referire la vb.net sau C# si chiar J# deoarece le cunosc. Acestea folosesc clase si sa stii ca nu am avut curiozitatea de a ma uita pe internet sa vad ca acest framework cuprinde si TSql (cred ca nici tu pana in acest moment).
antonii: Si da,lucrurile despre care ai vorbit sunt intradevar folositoare si trebuie stiute. Dar ce te faci cand le stii deja si + (deasupra)? De mult programez in assembly si imi place electronica asa ca stiu lucruri pe care altii nu le stiu(aici am vrut sa pun cateva exemple dar mi se pare de prisos).
antonii: Si nu...| stiu ce face codul de mai sus,deoarece ca orice programator pot sa ma adaptez la aceasta sintaxa desi e adevarat: nu stiu totul despre limbaj. Mi se pare ca citirea unei carti pentru a cunoste lucrurile de baza comune cu alte limbaje e (din nou) de prisos. Mie imi place sa ma folosesc de experienta desi e calea lunga insa cea sanatoasa.
antonii: Am citi despre acest limbaj si stiu ca prezinta unele trasaturi necomune (cross-platform,etc.) . Insa mi-ar placea mai mult sa-l studiez eu ,iar in acest sens un document din documentatie mi-ar fi de ajuns.
antonii: --imi pare rau pentru numarul de comentarii insa sunt sigur ca si tu stii ca acest mic chenar in care scriu acum nu-mi permite sa pun mai multe cuvinte.
blindseeker90: Da, ce sa spun, mult succes atunci.
GeorgeDINFO: Multumesc ca ma ajuti dinou Antonii chiar daca nu sti limbajul ceea ce mi-ai spus m-a ajutat mult.M-ai ajutat dinou chiar am nevoie de un inceput aici si va multumesc tuturor ...cartea acea de la 0 la expert se pare ca nu e chiar de la 0...cel putin nu inteleg cum vin majoritatea multuesc mult..
Alte întrebări interesante