大漠駝鈴

          置身浩瀚的沙漠,方向最為重要,希望此blog能向大漠駝鈴一樣,給我方向和指引。
          Java,Php,Shell,Python,服務(wù)器運(yùn)維,大數(shù)據(jù),SEO, 網(wǎng)站開發(fā)、運(yùn)維,云服務(wù)技術(shù)支持,IM服務(wù)供應(yīng)商, FreeSwitch搭建,技術(shù)支持等. 技術(shù)討論QQ群:428622099
          隨筆 - 238, 文章 - 3, 評(píng)論 - 117, 引用 - 0
          數(shù)據(jù)加載中……

          Java常見筆試面試題目解析(二): Java中的原生數(shù)據(jù)類型和引用類型的參數(shù)傳遞

          Java常見筆試面試題目解析(二): Java中的原生數(shù)據(jù)類型和引用類型的參數(shù)傳遞(javaeye)
          public class Point{
              
          private int x;
              
          private int y;
              
          public Point(int x,int y){
                  
          this.x = x;
                  
          this.y = y;
              }
              
          public int getX() {
                  
          return x;
              }
              
          public void setX(int x) {
                  
          this.x = x;
              }
              
          public int getY() {
                  
          return y;
              }
              
          public void setY(int y) {
                  
          this.y = y;
              }
          }

          public class ParameterTest {
              
          public void  changeInt(int a){
                  a 
          = 3;
              }
              
          public void changePoint(Point point){
                  point.setX(
          5);
                  point.setY(
          6);
              }
              
          public void changeString(String str){
                  str 
          = "abc";
                  System.out.println(str);
              }
              
          public static void main(String[] args){
                  
          int a = 1;//語(yǔ)句(1)
                  ParameterTest pt = new ParameterTest();//語(yǔ)句(2)
                  pt.changeInt(a);//語(yǔ)句(3)
                  System.out.println(a);//語(yǔ)句(4)
                  
                  Point point 
          = new Point(1,2);//語(yǔ)句(5)
                  pt.changePoint(point);//語(yǔ)句(6)
                  System.out.println(point.getX());//語(yǔ)句(7)
                  System.out.println(point.getY());//語(yǔ)句(8)
                  
                  String str 
          = "xyz";//語(yǔ)句(9)
                  pt.changeString(str);//語(yǔ)句(10)
                  System.out.println(str);//語(yǔ)句(11)
                  
              }
          }
          問題1:當(dāng)執(zhí)行完語(yǔ)句(4)后,打印的結(jié)果是什么?為什么?
          解答:當(dāng)執(zhí)行完語(yǔ)句(4)后,打印的結(jié)果是1。分析:首先調(diào)用定義 int a = 1;然后調(diào)用對(duì)象的changeInt(int a)方法,流程轉(zhuǎn)到changeInt方法里面去,把a(bǔ)的值賦給了方法changeInt的形式參數(shù),changeInt方法里面參數(shù)a的值為1,然后執(zhí) 行性方法體里的語(yǔ)句a = 3,即是將changeInt方法里面參數(shù)a的值由1改為3;注意:這個(gè)時(shí)候?qū)Ψ椒╟hangeInt方法里面參數(shù)a的值改變并沒有影響到main方法里 面的a的值,為什么?對(duì)于原生數(shù)據(jù)類型來說,它僅僅是把 main方法里面的a的值傳過去,傳值完后,兩者之間沒有任何的關(guān)系,你在changeInt方法里面對(duì)參數(shù)a的改變,對(duì)外面main方法的a沒有任何的 影響。因?yàn)槲抑皇前阎悼截愐环萁o你,拷貝完以后,你是你的我是我的,兩者之間沒有任何關(guān)系。因此,當(dāng)執(zhí)行完語(yǔ)句(4)后,打印結(jié)果是4。

          總結(jié):對(duì)八種原生數(shù)據(jù)類型來說,它們傳遞的時(shí)候傳遞的是它們的值(value),是值的拷貝,拷貝過去過后,你是你,我是我,兩者之間無(wú)任何關(guān)系。所以,方法里面對(duì)拷貝過來的值的改變,對(duì)被拷貝的原生數(shù)據(jù)類型沒有任何的影響。

          問題2:當(dāng)執(zhí)行完語(yǔ)句(7)(8)后,打印的結(jié)果是什么?為什么?
          解答:當(dāng)執(zhí)行完語(yǔ)句(7)(8)后,打印的結(jié)果分別是5,6。分析:語(yǔ)句(5)Point point = new Point(1,2),首先生成一個(gè)橫坐標(biāo)是1,縱坐標(biāo)是2的Point對(duì)象,因?yàn)橛嘘P(guān)鍵字new...,point是指向剛生成的這個(gè)對(duì)象的引用,即是 剛生成的對(duì)象的內(nèi)存地址,接著執(zhí)行語(yǔ)句(6),調(diào)用changePoint方法,它會(huì)把引用point傳過去賦值給changePoint(Point point)里面的point.注意:傳的是引用,即是對(duì)象的內(nèi)存地址,接著把對(duì)象的x改為5,y改為6,這時(shí)對(duì)象的橫縱坐標(biāo)發(fā)生了改變,分別變?yōu)?和 6。也就是說,在changePoint方法里面,對(duì)point所指向的對(duì)象的x和y的改變會(huì)反應(yīng)到你外面生成的這個(gè)對(duì)象,也就是1被改成了5,2被改成 了6。這個(gè)對(duì)象為什么會(huì)改變?這就涉及到 java對(duì)引用類型的傳遞方式上,首先語(yǔ)句(5)表示在內(nèi)存的堆里面生成了一個(gè)Point類型的對(duì)象,point這個(gè)引用它指向堆里面生成的Point類 型的對(duì)象,這個(gè)對(duì)象里x坐標(biāo)是1,y坐標(biāo)是2。接著去調(diào)用changePoint方法,在調(diào)用這個(gè)方法的時(shí)候,它會(huì)把point這個(gè)引用傳給 changePoint方法里面的point參數(shù)。在java里面,引用在java里面是對(duì)象在內(nèi)存堆里面的地址,它是把對(duì)象的地址傳遞到了 changePoint方法里面去了。地址本身也是一個(gè)int類型的值,它把地址通過參數(shù)的形式傳遞過去。舉例:比如說new Point(1,2)這個(gè)對(duì)象在內(nèi)存堆中的地址是1234,那么調(diào)用changePoint方法,它傳給changePoint(Point point)里面的point的地址也是1234,changePoint方法外面的引用指向了堆里面生成的Point類型的對(duì)象,那么對(duì) changePoint方法里面的參數(shù)引用也指向同一個(gè)堆里面生成的Point類型的對(duì)象,java里面只要有兩個(gè)引用它們的地址是一樣的必然指向同一個(gè) 對(duì)象。所以說當(dāng)changePoint方法調(diào)用的時(shí)候,方法里面的引用和方法外面的引用它們指向的是同一個(gè)對(duì)象,究其原因它們是內(nèi)存地址的傳遞,兩個(gè)引用 的內(nèi)存地址是一樣的必然指向同一個(gè)對(duì)象。通過執(zhí)行changePoint方法里面的語(yǔ)句,把這個(gè)引用指向的對(duì)象的x改為5,y改為6。然后方法結(jié)束,結(jié)束 之后,我打印changePoint方法外面這個(gè)引用它所指向?qū)ο蟮膞坐標(biāo)和y坐標(biāo),因?yàn)檫@兩個(gè)引用指向的是同一個(gè)對(duì)象,所以結(jié)果是5和6。

          問題3:當(dāng)執(zhí)行完語(yǔ)句(11)后,打印的結(jié)果是什么?為什么?
          解答:當(dāng)執(zhí)行完語(yǔ)句(11)后,打印的結(jié)果是xyz。分析:語(yǔ)句(9) String str = "xyz";表示str這個(gè)引用指向常量"xyz"(在String Pool里面),當(dāng)執(zhí)行語(yǔ)句(10)的changeString(String str)方法時(shí),將全局的str引用傳遞給changeString方法里面的str,這時(shí)會(huì)導(dǎo)致全局的str引用和changeString方法里面的 引用會(huì)指向同一個(gè)對(duì)象"xyz",所以當(dāng)完成參數(shù)傳遞還沒有執(zhí)行方法里面的語(yǔ)句體的時(shí)候,它們的引用是指向同一個(gè)對(duì)象"xyz"的,接著執(zhí)行方法體里面的 語(yǔ)句,這時(shí)會(huì)在String Pool里面生成一個(gè)"abc"的對(duì)象,同時(shí)將方法體里面的str指向String Pool里面的"abc"對(duì)象。一個(gè)引用在某一時(shí)刻始終只能指向一個(gè)對(duì)象,changString方法外面的str始終是指向"xyz"對(duì)象的。所以輸出 的時(shí)候始終是"xyz"。

          總結(jié): 在java里面,對(duì)方法的參數(shù)傳遞,不管是原生數(shù)據(jù)類型還是引用類型,一律是傳值:pass by value。對(duì)原生數(shù)據(jù)類型來說,傳遞的值就是它被賦予的那個(gè)值,比如說 int a = 3 就把3這個(gè)值傳到方法里面去;引用類型來說,引用本身是一個(gè)地址,是一個(gè)int類型的內(nèi)存地址值,所以說它把這個(gè)值傳遞到方法里面去傳遞的也是值。

          posted on 2009-02-28 10:54 草原上的駱駝 閱讀(538) 評(píng)論(0)  編輯  收藏 所屬分類: 其它

          主站蜘蛛池模板: 句容市| 昌都县| 志丹县| 大方县| 兰州市| 武隆县| 邻水| 临桂县| 卢龙县| 云浮市| 乌什县| 兴和县| 长子县| 孟州市| 德庆县| 凭祥市| 忻城县| 若尔盖县| 防城港市| 从江县| 泰安市| 勃利县| 忻州市| 平利县| 崇仁县| 车致| 龙州县| 乌审旗| 彝良县| 阿城市| 郴州市| 泗阳县| 赫章县| 包头市| 灵宝市| 庆阳市| 灵丘县| 寿阳县| 义乌市| 南安市| 瑞安市|