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
Răspunsuri la întrebare
Răspuns de
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
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
Răspuns de
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.
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.
Alte întrebări interesante
Limba română,
8 ani în urmă
Matematică,
8 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă
Matematică,
9 ani în urmă
Istorie,
9 ani în urmă