Presne.

A) Mozete sa na to divat ako Cckar
Vsetko sa odovzdava hodnotou:
a) ak su to primitivne typy, tak je to zrejme
b) ak su to objektove typy, tak hodnotou odovzda adresa (pointer na objekt), lenze s adresou nemozete robit pointerovu aritmetiku. Presmerovanie pointra v metode nema ziaden dopad na samotny parameter, kedze ten sa do skutocneho parametra nakopiroval hodnotou
c) pole je prakticky objektovy typ

B) Mozete sa na to divat ako Java
a) primitivne typy idu hodnotou
b) objektove typy idu referenciou, co prakticky znamena, ze pre ucely manipulacie sa stotoznuje pointer na objekt so samotnym objektom. Ak mate objekt v parametri metody, zmeny jeho atributov/vlastnosti su vidiet aj z volajucej metody, ale ak do parametra v ramci metody priradite referenciu na iny objekt, tato zmena sa mimo metody neprejavi.

    public static void handleBuffer(byte[] data) {
        data = new byte[] {3, 1, 5};

    }

    public static void main(String[] args) {
        byte[] buffer = new byte[] {2, 4, 5};
        handleBuffer(buffer);

        System.out.println(Arrays.toString((buffer)));
        // vypis 2, 4, 5
    }

On 4. 4. 2011 13:48, Libor Jelinek wrote:
Takže dělá prostě něco jako toto:

    static void zmenPoleBajtu(byte[] b) {
        b[0] = 'd';
        b[1] = 'e';
        b[2] = 'f';
    }

Díky! Už jsem doma! Proč jste to neřekl hned? :-) Ono je to s těmi referencemi poměrně složité. Alespoň pro mojí hlavu :-) A jak tu někdo říkal tak asi hodně programátorů prostě jen používá a nepřemýšlí co se přesně děje. A čím víc umí Springů, J2EE a všeho podobného tím víc je možná zarážející, že ty úplné nej low-level základy pokulhávají. Jako vysocí matematici nemějí pak spočítat, kolik jim májí vrátit v krámě :-)

Děkuji pane Novotný za vysvětlení!
Libor

Dne 4. dubna 2011 13:42 Robert Novotny <[email protected] <mailto:[email protected]>> napsal(a):

    Ona nemeni pole, ona meni prvky tohto pola.


    On 4. 4. 2011 13:33, Libor Jelinek wrote:
    Děkuji pane Thone,
    to tedy znamená, že znovu nechápu jak může read(byte[] b) z např.
    FileInputStream měnít hodnotu parametru, když je mu předána
    nikoli reference, ale nový objekt se stejnou hodnotou jako měl
    (má) mnou předávaný... Viz můj předchozí nebo váš úryvek kódu.

    Libor

    2011/4/4 Ladislav Thon <[email protected] <mailto:[email protected]>>

            nikoliv, naopak, vše je předáváno referencí.


        Ne, původní pisatel to má správně, vše se předává hodnotou --
        primitivní i referenční typy. Tohle je pekelně rozšířený omyl.

        Předávání parametrů odkazem (referencí) by znamenalo, že
        můžete tu původní proměnnou "vyměnit", asi takhle:

        void caller() {
          String a = "a";
          callee(a);
          // !!! co je v proměnné a?
        }

        void callee(String param) {
          String b = "b";
          param = b;
        }

        Kdyby se parametr param v metodě callee předával referencí,
        pak by na konci metody caller platilo "b".equals(a). Pokud se
        dobře pamatuju, v C# by to takhle fungovalo, kdyby ten
        parametr byl deklarovaný "ref String param".

        Jenže referenční typy se v Javě předávají hodnotou --
        dostanete kopii reference, takže můžete změnit _stav_ objektu
        (v ukázce ne, String je neměnitelný), ale nemůžete _vyměnit_
        ten objekt jako takový.

        Pro pole platí totéž, jsou to taky referenční typy (dalo by
        se říct, že to jsou vlastně taky objekty, a nebyla by to
        úplná lež).

        LT





Odpovedet emailem