<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    superwei

    導航

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    對象(object)與引用(reference)

    兩個常識
    一,對象(object)與引用(reference)
    有許多書籍,對于對象與引用之間的關系一直語焉不詳,甚至有的干脆是錯誤的說法,我們必須對這個問題
    有個清晰的了解.
    我們知道:
    A a = new A();
    產生一個A類型的對象,a是這個對象的的一個引用,即a指向heap中真正的對象,而a和其他基本數據類型
    一起存放在stack中.也就是object通過reference操控,在底層的話,a更象一個指針.
    對于有些書本所說,a就是對象,初學者的話也沒什么大問題,因為對a的操作,就是對a指向的對象的操作.
    問題是,當a的指向發生改變時,a就是對象的說法就不能適應程序設計的需要.
    讓我們來看一個簡單的程序:

    class A
    {
    private int i=0;
    public void setI(int x)
    {
    i=x;
    }
    public int getI(){
    return i;
    }
    }

    public class MyRef1 {


    public static void main(String[] args) {
    A a=new A();
    A b=new A();
    a.setI(10);
    b.setI(15);
    System.out.println("a的i="+a.getI());
    System.out.println("b的i="+b.getI());
    a=b;
    a.setI(20);
    System.out.println("a的i="+a.getI());
    System.out.println("b的i="+b.getI());

    }

    }
    我想,大家對于程序的輸出應該認為是:
    a的i=10
    b的i=15
    a的i=20
    b的i=15
    第一,第二行應該沒什么異義,第三行是對a設置后i的值,問題是,第四行是不會輸出i=15的,正確結果是:
    i=20
    因此,a,b都是對對象的引用,當我們將b的引用賦予a時,a已經重新指向了b,對指向發生改變后的a的操作,
    就是對b的操作.
    當然,那些堅持"a,b就是對象"說法的人,還是可以解釋這個問題:對啊,a對象"變成"了b對象,沒有什么,很
    正常啊.
    那么,我們再來看:

    我們知道,java通過final來定義常量:
    final int i=10;
    當我們對一個常量重新賦值時,會發生編譯錯誤:
    i=5;//編譯不通過
    我們也可以通過final來定義常量對象:
    final A a = new A();
    這樣的話,我們將不能對a重新賦值.


    如果a本身是個對象,那么,這個對象就不能發生改變,其實,a只不過是一個引用,它只能指向原來指向的對象,
    并不是說它所指的對象的狀態不能改變,因此,我們可以通過不改變a原來的指向的情況下對對象狀態進行改
    變,看程序:

    class A
    {
    private int i=0;
    public void setI(int x)
    {
    i=x;
    }
    public int getI(){
    return i;
    }
    }

    public class MyRef1 {



    public static void main(String[] args) {


    final A a = new A();
    System.out.println(a.getI());
    a.setI(8);
    System.out.println(a.getI());


    }

    }

    如果a本身是個對象,那么,根本就不可能
    a.setI(8);
    而實際a是一個引用,程序可以編譯并運行:
    顯示:8

    總之,java通過renfence來操控object,是深入學習java知識的基礎,例如下面一點:


    二,java參數是值(value)傳遞還是引用(reference)傳遞
    我們先看程序:
    public class MyRef2 {

    static int x=10;
    static int y=20;
    public static void fangfa(int i)
    {
    i++;
    x=i;
    }

    public static void main(String[] args) {
    System.out.println("x="+x);
    System.out.println("y="+y);
    MyRef2.fangfa(y);
    System.out.println("x="+x);
    System.out.println("y="+y);


    }

    }
    顯然,將顯示:
    x=10
    y=20
    x=21
    y=20
    y的值并沒有發生改變,MyRef2.fangfa(y)使用的僅僅是y的值,里面的i++也不會作用到y本身.
    顯然,java的參數是值傳遞,但是,為什么會有引用傳遞的說法呢?
    看下面這個程序:
    class A
    {
    private int i=0;
    public void setI(int x)
    {
    i=x;
    }
    public int getI(){
    return i;
    }
    }

    public class MyRef1 {

    public static void setA1(A newA,int t)
    {
    newA.setI(t);

    }

    public static void main(String[] args) {
    A a=new A();
    System.out.println(a.getI());
    MyRef1.setA1(a, 30);
    System.out.println(a.getI());
    }

    }
    按照值傳遞的說法,MyRef1.setA1(a, 30);將使用a所指的對象的一個復件,最終對這個對象沒有作用
    而事實是,方法對這個對象起了作用,程序將顯示0,30.那么,java參數是值傳遞是不是錯誤了呢?
    老爹告訴你:no!
    我們要記住,a只不過是對象的reference,而reference的復件與原來的reference指向的是同一個對象
    我們對復件的操作,與對a的操作一樣,最終還是對指向對象的操作,因此,java的參數,只有值傳遞.

    posted on 2005-10-31 11:11 小辭猬 閱讀(307) 評論(0)  編輯  收藏 所屬分類: JAVA

    主站蜘蛛池模板: 亚洲中久无码不卡永久在线观看| 美丽姑娘免费观看在线观看中文版| 免费观看黄网站在线播放| 久久久无码精品亚洲日韩京东传媒| 热久久这里是精品6免费观看| 超清首页国产亚洲丝袜| 久青草视频在线观看免费| 激情97综合亚洲色婷婷五| 国产午夜精品理论片免费观看 | 久青草视频在线观看免费| a级亚洲片精品久久久久久久| a毛片在线免费观看| 久久精品国产亚洲夜色AV网站| 色欲A∨无码蜜臀AV免费播| 久久久无码精品亚洲日韩按摩 | 国内自产少妇自拍区免费| 亚洲av永久无码| 亚洲精品无码成人片在线观看 | 国产精品青草视频免费播放| 亚洲精品色午夜无码专区日韩| 精品在线免费观看| 亚洲国产成人精品久久| 韩国日本好看电影免费看| 丁香六月婷婷精品免费观看| 亚洲AV午夜成人影院老师机影院| 亚洲精品免费在线视频| 亚洲国产一区二区三区在线观看| 又粗又硬免费毛片| 很黄很污的网站免费| 亚洲伊人久久大香线焦| 四虎永久成人免费影院域名| 国产精品免费久久久久电影网| 久久精品国产亚洲沈樵| 黄色成人网站免费无码av| 丁香六月婷婷精品免费观看| 久久综合亚洲鲁鲁五月天| 国产一级淫片免费播放| 亚洲免费视频网站| 国产精品亚洲天堂| 亚洲第一永久在线观看| 亚洲Av无码乱码在线播放|