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

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

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

    superwei

    導(dǎo)航

    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    統(tǒng)計(jì)

    常用鏈接

    留言簿(4)

    隨筆分類(lèi)

    隨筆檔案

    文章分類(lèi)

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    對(duì)象(object)與引用(reference)

    兩個(gè)常識(shí)
    一,對(duì)象(object)與引用(reference)
    有許多書(shū)籍,對(duì)于對(duì)象與引用之間的關(guān)系一直語(yǔ)焉不詳,甚至有的干脆是錯(cuò)誤的說(shuō)法,我們必須對(duì)這個(gè)問(wèn)題
    有個(gè)清晰的了解.
    我們知道:
    A a = new A();
    產(chǎn)生一個(gè)A類(lèi)型的對(duì)象,a是這個(gè)對(duì)象的的一個(gè)引用,即a指向heap中真正的對(duì)象,而a和其他基本數(shù)據(jù)類(lèi)型
    一起存放在stack中.也就是object通過(guò)reference操控,在底層的話(huà),a更象一個(gè)指針.
    對(duì)于有些書(shū)本所說(shuō),a就是對(duì)象,初學(xué)者的話(huà)也沒(méi)什么大問(wèn)題,因?yàn)閷?duì)a的操作,就是對(duì)a指向的對(duì)象的操作.
    問(wèn)題是,當(dāng)a的指向發(fā)生改變時(shí),a就是對(duì)象的說(shuō)法就不能適應(yīng)程序設(shè)計(jì)的需要.
    讓我們來(lái)看一個(gè)簡(jiǎn)單的程序:

    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());

    }

    }
    我想,大家對(duì)于程序的輸出應(yīng)該認(rèn)為是:
    a的i=10
    b的i=15
    a的i=20
    b的i=15
    第一,第二行應(yīng)該沒(méi)什么異義,第三行是對(duì)a設(shè)置后i的值,問(wèn)題是,第四行是不會(huì)輸出i=15的,正確結(jié)果是:
    i=20
    因此,a,b都是對(duì)對(duì)象的引用,當(dāng)我們將b的引用賦予a時(shí),a已經(jīng)重新指向了b,對(duì)指向發(fā)生改變后的a的操作,
    就是對(duì)b的操作.
    當(dāng)然,那些堅(jiān)持"a,b就是對(duì)象"說(shuō)法的人,還是可以解釋這個(gè)問(wèn)題:對(duì)啊,a對(duì)象"變成"了b對(duì)象,沒(méi)有什么,很
    正常啊.
    那么,我們?cè)賮?lái)看:

    我們知道,java通過(guò)final來(lái)定義常量:
    final int i=10;
    當(dāng)我們對(duì)一個(gè)常量重新賦值時(shí),會(huì)發(fā)生編譯錯(cuò)誤:
    i=5;//編譯不通過(guò)
    我們也可以通過(guò)final來(lái)定義常量對(duì)象:
    final A a = new A();
    這樣的話(huà),我們將不能對(duì)a重新賦值.


    如果a本身是個(gè)對(duì)象,那么,這個(gè)對(duì)象就不能發(fā)生改變,其實(shí),a只不過(guò)是一個(gè)引用,它只能指向原來(lái)指向的對(duì)象,
    并不是說(shuō)它所指的對(duì)象的狀態(tài)不能改變,因此,我們可以通過(guò)不改變a原來(lái)的指向的情況下對(duì)對(duì)象狀態(tài)進(jìn)行改
    變,看程序:

    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本身是個(gè)對(duì)象,那么,根本就不可能
    a.setI(8);
    而實(shí)際a是一個(gè)引用,程序可以編譯并運(yùn)行:
    顯示:8

    總之,java通過(guò)renfence來(lái)操控object,是深入學(xué)習(xí)java知識(shí)的基礎(chǔ),例如下面一點(diǎn):


    二,java參數(shù)是值(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的值并沒(méi)有發(fā)生改變,MyRef2.fangfa(y)使用的僅僅是y的值,里面的i++也不會(huì)作用到y(tǒng)本身.
    顯然,java的參數(shù)是值傳遞,但是,為什么會(huì)有引用傳遞的說(shuō)法呢?
    看下面這個(gè)程序:
    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());
    }

    }
    按照值傳遞的說(shuō)法,MyRef1.setA1(a, 30);將使用a所指的對(duì)象的一個(gè)復(fù)件,最終對(duì)這個(gè)對(duì)象沒(méi)有作用
    而事實(shí)是,方法對(duì)這個(gè)對(duì)象起了作用,程序?qū)@示0,30.那么,java參數(shù)是值傳遞是不是錯(cuò)誤了呢?
    老爹告訴你:no!
    我們要記住,a只不過(guò)是對(duì)象的reference,而reference的復(fù)件與原來(lái)的reference指向的是同一個(gè)對(duì)象
    我們對(duì)復(fù)件的操作,與對(duì)a的操作一樣,最終還是對(duì)指向?qū)ο蟮牟僮?因此,java的參數(shù),只有值傳遞.

    posted on 2005-10-31 11:11 小辭猬 閱讀(313) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): JAVA

    主站蜘蛛池模板: 最近免费中文字幕大全高清大全1| 亚洲国产美女在线观看 | 无码精品人妻一区二区三区免费| 国产情侣激情在线视频免费看| 久久亚洲精品中文字幕| 中文字幕视频在线免费观看| 亚洲午夜无码片在线观看影院猛 | 久草视频免费在线观看| 亚洲AV无码国产在丝袜线观看| 三上悠亚在线观看免费| 国产亚洲一区二区精品| a级在线免费观看| 亚洲网站视频在线观看| 97国产免费全部免费观看| 亚洲精品国产情侣av在线| a毛片基地免费全部视频| 亚洲а∨天堂久久精品9966| 日韩免费观看视频| 无码人妻一区二区三区免费视频| 一本色道久久88亚洲综合 | 毛片基地看看成人免费| 水蜜桃亚洲一二三四在线 | 免费观看的毛片手机视频| 亚洲第一成年网站视频| 日韩免费视频网站| 国产精品高清免费网站| 色噜噜综合亚洲av中文无码| 免费中文熟妇在线影片| 黄色大片免费网站| 亚洲AV无码成人精品区天堂| 日韩免费一区二区三区在线| 精品视频免费在线| 无码乱人伦一区二区亚洲| 最近中文字幕免费mv视频8| 黄色网页免费观看| 久久精品国产亚洲AV嫖农村妇女| 两个人的视频高清在线观看免费| 国产午夜亚洲精品不卡| 久久亚洲免费视频| 日韩精品免费一区二区三区| 中文字幕免费在线看电影大全|