| | |
| |
|
Објектно оријентирани концепти во Јава - Прв дел |
Копирање на објекти
Има разлика како Јава ги обработува примитивните податочни типови како што се „integer“ и „Boolean“ за разлика од тоа како ги обработува објектите. Погледни ги овие два фрагменти од изворен код:
1 int a = 5;
2 int b = a;
3 b = b + 1;
4 System.out.println("a=" + a + " b=" + b);
5
6 Drvo d1 = new Drvo();
7 d1.visina = 5;
8 Drvo d2 = d1;
9 d2.visina = d2.visina + 1;
10 System.out.println("d1.visina=" + d1.visina +
11 " d2.visina=" + d2.visina);
Во двата случаи креираме две променливи, задавајќи ја вредноста од првата променлива на втората, но излезто од горенаведениот изворен код е следниов:
a=5 b=6
d1.visina=6 d2.visina=6
Во првиот случај (со примитивниот податочен тип „int“) менувањето на вредноста на втората променлива не влијае на вредноста на првата. Во случајот со класата Drvo промената на особината „visina“ кај првата променлива (d1) ќе се одрази на особината „visina“ на втората променлива (d2). Зависно од тоа како размислуваш, едниот или другиот резултат ти имаат смисла, но очигледно е дека нешто сосема различно се случува во двата случаи.
Во првиот случај (кој на прв поглед на повеќето луѓе им има повеќе смисол), кога вредноста од „a“ е сместена во „b“ (линија 2), Јава всушност креира копија од вредноста 5 за да ја смести во променливата „b“. Така да всушност се работи за две различни копии од бројот 5, еден сместен во „a“, другиот сместен во „b“.
Приказната е сосема различна во вториот случај. Во линијата со број 8 кога вредноста од променливата „d1“ е сместена во променливата „d2“ всушност не се креира копија од објектот Drvo за да се смести во променливата „d2“. туку „d2“ станува референца до инстанцата од класата Drvo во меморијата. Со други зборови, „t2“ и „t1“ покажуваат кон едно исто Drvo! Затоа при промената на висината на „t2“ исто така ја менува висината и на „t1“. Променливите „t1“ и „t2“ не се различни како што се „a“ и „b“.
Добро, но што ако сакам да направам вистинска копија на објектот?
Па, има повеќе решенија за тоа. Првото е всушност да креираш двa објекти, а потоа да ги ископираш особините од едниот во другиот:
1 Drvo d1 = new Drvo();
2 d1.visina = 5;
3 Drvo d2 = new Drvo();
4 d2.visina = d1.visina;
5 d2.visina = d2.visina + 1;
6 System.out.println("d1.visina=" + d1.visina +
7 " d2.visina=" + d2.visina);
Од ова ќе произлезе посакуваниот резултат „d1.visina=5 d2.visina=6“ бидејќи висините на двата објекти всушност се примитивни податочни типови (int), а не објекти, така да сетирањето на вредноста d1.visina креира посебна копија на целобројната вредност (int) за да t2 ја искористи.
Друга опција е да се имплементира посебен метод во твојата класа кој ќе креира копии.
Овој метод треба да обезбеди директна копија од објектот за одвоена употреба. Еве како би изгледала класата „Drvo“ со методот „copy“:
1 class Drvo {
2 public int visina = 0;
3 public void rastenje() {
4 visina = visina + 1;
5 }
6 public Drvo copy() {
7 Drvo copy = new Drvo();
8 copy.visina = visina;
9 return copy;
10 }
11 }
А еве како да би го користел овој нов метод:
1 Drvo d1 = new Drvo();
2 d1.visina = 5;
3 Drvo d2 = d1.copy(); // Kreiraj kopija od d1
4 d2.visina = d2.visina + 1;
5 System.out.println("d1.visina=" + d1.visina +
6 " d2.visina=" + d2.visina);
И ова решение ќе ни го даде саканиот резултат.
|
|
|
|
|
|
| |
|
|
---|
JavaTM и Java-базираните ознаки се трговски марки или регистрирани трговски марки на Sun Microsystems, Inc. во САД и други држави. Java.com.mk никако не соработува со Sun Microsystems, Inc. Сите други трговски марки се сопственост на нивните сопственици. |
|