• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            關于Java的引用和函數參數傳遞

            Java中沒有了指針,這有時給程序員帶來了些許不便。Java的語言設計者強調,這種不便可以通過Java的引用特性得到彌補。即對于Java的任何對象,我們可以申明對象變量,但不產生實例,這樣,把該變量指向具有實際實例的對象,即可實現同一實例對象的多個變量引用,如:

            int x[]={1,2,3,4,5}, y[];

            y=x;

            for(int i=0; i<y.length; i++) System.out.print(“   ”+y[i]);

            則完成了通過yx的引用。從這個實際效果看,y在這里就很象C語言中的指針了。只不過對于“指針”y我們不能進行+-這類算數運算,即Java的引用只能指向程序限定的能夠訪問的現存對象,所以Java的實現者認為它是靈活同時也是安全的。

            但對于C或者C++中能夠通過函數簡單實現的兩個數交換問題,即C++如下函數:

            void swap(int &x, int &y) { int t; t=x; x=y; y=t; }

            Java中是否能夠實現呢?

            按照Java的規定,Java的函數參數在傳遞的時候有兩種方式。對于基本類型,如intdouble等作為函數參數傳遞時,采取的是傳值方式。而對于對象,如數組、字符串等作為參數傳遞時,采用的是引用方式,即此時在函數中對傳遞的對象的修改將完全影響原對象。那能否對于對象利用引用完成值的交換呢?下面的程序充分地演示了這個問題:

            public class test {

              public static void main(String[] arg) {

                int x1[]={1,2,3},x2[]={3,2,1};

                swap(x1,x2);//采用swap函數,即直接利用參數引用進行交換

                System.out.print("swap->X1:\t"); printarr(x1);

                System.out.print("swap->X2:\t"); printarr(x2);

                swapArray(x1,x2);//采用swapArray函數,利用對于對象的值的修改進行交換

                System.out.print("swapArr->X1:\t"); printarr(x1);

            System.out.print("swapArr->X2:\t"); printarr(x2);

            Object t;

                t=x1; x1=x2; x2=(int[])t;//在非函數調用中直接利用引用進行交換

                System.out.print("Tswap->X1:\t"); printarr(x1);

                System.out.print("Tswap->X2:\t"); printarr(x2);

              }

              public static void swap(Object x, Object y) {//直接利用參數引用交換

                Object t=x;

                x=y;

                y=t;

              }

              public static void swapArray(int x[], int y[]) {//對引用對象的值進行修改完成交換

                if(x.length!=y.length) return;

                int t[]=x.clone();

                for(int i=0; i<x.length; i++) x[i]=y[i];

                for(int i=0; i<y.length; i++) y[i]=t[i];

              }

              public static void printarr(int x[]) {//打印數組

                for(int i=0; i<x.length; i++) System.out.print(x[i]+"  ");

                System.out.println();

              }

            }

            在函數swap中,我們直接利用參數進行交換。在函數swapArray中,我們通過修改參數指向的兩個數組的值進行交換。而在main函數沒有進行函數參數傳遞的情況下,我們直接利用參數的引用進行了一次交換。

            程序的運行結果如下:

            swap->X1:     1  2  3 

            swap->X2:     3  2  1 

            swapArr->X1: 3  2  1 

            swapArr->X2: 1  2  3 

            Tswap->X1:   1  2  3 

            Tswap->X2:   3  2  1 

            從運行結果我們可以清楚地看到,函數swap實際沒有完成交換,而函數swapArray和直接在main中利用引用進行的交換是成功的。從這里我們可以得知,雖然Java的引用可以實現CC++的指針的類似的效果,這在主函數中的引用交換得到了證明。但是一但進行了函數的參數傳遞,這種引用方式的交換便實效了。雖然它的交換方式和主函數中利用Object引用t進行的交換方式相同。猜測其原因(因為我不是Java的實現者),只能說明,函數中的引用變量和主函數中調用的變量是不相同的。即在調用swap函數時,雖然將x1的引用傳遞給了xx2傳遞給了yxy進行了交換,但x1x2并沒有進行交換。也就是說,在函數swap申明參數xy時,實際另外真正的生成了與x1x2完全不相干的引用,只不過xy都同樣指向了x1x2罷了,即此時,數組對象x1x2同時分別有兩個指針xx1yy1指向它們。這樣的結果當然不能完成如CC++類似的交換。唯一的辦法是如swapArray函數中一樣,不要試圖交換,只能試圖修改參數所指向的兩個對象的值來達到交換的效果。

            所以我得出的一個相關的結論是:Java永遠也不能實現如CC++一樣的swap函數。

             

            posted on 2009-07-24 12:09 肥仔 閱讀(1349) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

            乱亲女H秽乱长久久久| 97精品国产97久久久久久免费| 国产99精品久久| 久久久久99精品成人片 | 精品国产日韩久久亚洲| 久久午夜福利无码1000合集| 一本一本久久aa综合精品| 久久人妻少妇嫩草AV蜜桃| 久久99国产精品二区不卡| 久久久久se色偷偷亚洲精品av| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久天天躁狠狠躁夜夜不卡| 亚洲va中文字幕无码久久不卡| 久久国产午夜精品一区二区三区| 久久精品国产亚洲AV不卡| 国产成人久久精品二区三区| 久久99热精品| 无码超乳爆乳中文字幕久久| 久久久久国色AV免费观看| 国内精品久久久久久99| 97久久国产亚洲精品超碰热| 久久久久久亚洲精品影院| 色播久久人人爽人人爽人人片aV | 久久精品aⅴ无码中文字字幕不卡| 国产精品久久久久…| 久久99热这里只有精品国产| 丰满少妇人妻久久久久久4| 久久综合给合久久狠狠狠97色69| 久久久久久久女国产乱让韩| 亚洲午夜精品久久久久久浪潮 | 人妻精品久久久久中文字幕| 欧美激情精品久久久久| 狠狠色丁香婷婷综合久久来来去 | WWW婷婷AV久久久影片| 狠狠色婷婷久久一区二区 | 久久99热精品| 久久er热视频在这里精品| 久久电影网2021| 91久久香蕉国产熟女线看| 精品久久人人妻人人做精品| 久久久精品视频免费观看|