Stránka 1 z 1

Java - kopie proměných  Vyřešeno

Napsal: 26 říj 2013 20:28
od honzaik
Tak jsem si myslel že mě už taková základní věc v javě nepřekvapí, ale stalo se :D. Mám úplně jednoduchý kód

Kód: Vybrat vše

public class Derp{

   public static void main(String[] args) {
      byte[] d = {0,1,1,1,1,5};
      byte[] b = d;
      System.out.println(d[0]);
      System.out.println(b[0]);
      d[0] = 15;
      System.out.println(d[0]);
      System.out.println(b[0]);
   }
}

a výstup je

Kód: Vybrat vše

0
0
15
15

a nechápu, nebo spíše mě děsí že to tahle funguje. prostě když upravím jednu proměnou tak to automaticky změní i tu že které se "zkopírovala", funguje to i obráceně. jak se dá teda zkopírovat obsah jedné proměnné do druhé a poté samostatně upravovat její obsah bez upravování té druhé :D
logicky bych chápal že to udělá kopii té proměnné a pak už je to nijak nespojuje a tak to funguje všude (myslím si)
// aha tak to tak funguje v javascriptu i c# takže asi všude :D

Re: Java - kopie proměných

Napsal: 26 říj 2013 21:42
od faraon
Tohle funguje jen pro jednotlivé proměnné. Pole se nekopírují, předává se na ně přímo adresa, takže normálně upravuješ to původní...
Dokonce je takhle možné, i když jen v určitých případech, měnit konstanty, třeba řetězce zapsané přímo v kódu programu!

Re: Java - kopie proměných

Napsal: 26 říj 2013 21:48
od domitea
Klasická začátečnická chyba u nás na škole.

Pole b je pointer(*d) na pole d. Takže když měníš b, měníš vlastně d, ale když měníš d, tak měníš d. Na tohle si dávej hlavně pozor u objektů, protože dané názvy "uchovávají" pouze adresu na nějaký objekt! Naopak u primitivních typů (ty co mají malé písmeno na začátku) "uchovávají" hodnotu ;)

A to Javu nemám rád a tak hezky to umím :?

Re: Java - kopie proměných

Napsal: 26 říj 2013 22:25
od honzaik
díky za upřesnění jak to funguje ;)