Java常見筆試面試題目解析(二): Java中的原生數據類型和引用類型的參數傳遞
Java常見筆試面試題目解析(二): Java中的原生數據類型和引用類型的參數傳遞(javaeye)
解答:當執行完語句(4)后,打印的結果是1。分析:首先調用定義 int a = 1;然后調用對象的changeInt(int a)方法,流程轉到changeInt方法里面去,把a的值賦給了方法changeInt的形式參數,changeInt方法里面參數a的值為1,然后執 行性方法體里的語句a = 3,即是將changeInt方法里面參數a的值由1改為3;注意:這個時候對方法changeInt方法里面參數a的值改變并沒有影響到main方法里 面的a的值,為什么?對于原生數據類型來說,它僅僅是把 main方法里面的a的值傳過去,傳值完后,兩者之間沒有任何的關系,你在changeInt方法里面對參數a的改變,對外面main方法的a沒有任何的 影響。因為我只是把值拷貝一份給你,拷貝完以后,你是你的我是我的,兩者之間沒有任何關系。因此,當執行完語句(4)后,打印結果是4。
總結:對八種原生數據類型來說,它們傳遞的時候傳遞的是它們的值(value),是值的拷貝,拷貝過去過后,你是你,我是我,兩者之間無任何關系。所以,方法里面對拷貝過來的值的改變,對被拷貝的原生數據類型沒有任何的影響。
問題2:當執行完語句(7)(8)后,打印的結果是什么?為什么?
解答:當執行完語句(7)(8)后,打印的結果分別是5,6。分析:語句(5)Point point = new Point(1,2),首先生成一個橫坐標是1,縱坐標是2的Point對象,因為有關鍵字new...,point是指向剛生成的這個對象的引用,即是 剛生成的對象的內存地址,接著執行語句(6),調用changePoint方法,它會把引用point傳過去賦值給changePoint(Point point)里面的point.注意:傳的是引用,即是對象的內存地址,接著把對象的x改為5,y改為6,這時對象的橫縱坐標發生了改變,分別變為5和 6。也就是說,在changePoint方法里面,對point所指向的對象的x和y的改變會反應到你外面生成的這個對象,也就是1被改成了5,2被改成 了6。這個對象為什么會改變?這就涉及到 java對引用類型的傳遞方式上,首先語句(5)表示在內存的堆里面生成了一個Point類型的對象,point這個引用它指向堆里面生成的Point類 型的對象,這個對象里x坐標是1,y坐標是2。接著去調用changePoint方法,在調用這個方法的時候,它會把point這個引用傳給 changePoint方法里面的point參數。在java里面,引用在java里面是對象在內存堆里面的地址,它是把對象的地址傳遞到了 changePoint方法里面去了。地址本身也是一個int類型的值,它把地址通過參數的形式傳遞過去。舉例:比如說new Point(1,2)這個對象在內存堆中的地址是1234,那么調用changePoint方法,它傳給changePoint(Point point)里面的point的地址也是1234,changePoint方法外面的引用指向了堆里面生成的Point類型的對象,那么對 changePoint方法里面的參數引用也指向同一個堆里面生成的Point類型的對象,java里面只要有兩個引用它們的地址是一樣的必然指向同一個 對象。所以說當changePoint方法調用的時候,方法里面的引用和方法外面的引用它們指向的是同一個對象,究其原因它們是內存地址的傳遞,兩個引用 的內存地址是一樣的必然指向同一個對象。通過執行changePoint方法里面的語句,把這個引用指向的對象的x改為5,y改為6。然后方法結束,結束 之后,我打印changePoint方法外面這個引用它所指向對象的x坐標和y坐標,因為這兩個引用指向的是同一個對象,所以結果是5和6。
問題3:當執行完語句(11)后,打印的結果是什么?為什么?
解答:當執行完語句(11)后,打印的結果是xyz。分析:語句(9) String str = "xyz";表示str這個引用指向常量"xyz"(在String Pool里面),當執行語句(10)的changeString(String str)方法時,將全局的str引用傳遞給changeString方法里面的str,這時會導致全局的str引用和changeString方法里面的 引用會指向同一個對象"xyz",所以當完成參數傳遞還沒有執行方法里面的語句體的時候,它們的引用是指向同一個對象"xyz"的,接著執行方法體里面的 語句,這時會在String Pool里面生成一個"abc"的對象,同時將方法體里面的str指向String Pool里面的"abc"對象。一個引用在某一時刻始終只能指向一個對象,changString方法外面的str始終是指向"xyz"對象的。所以輸出 的時候始終是"xyz"。
總結: 在java里面,對方法的參數傳遞,不管是原生數據類型還是引用類型,一律是傳值:pass by value。對原生數據類型來說,傳遞的值就是它被賦予的那個值,比如說 int a = 3 就把3這個值傳到方法里面去;引用類型來說,引用本身是一個地址,是一個int類型的內存地址值,所以說它把這個值傳遞到方法里面去傳遞的也是值。
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;//語句(1)
ParameterTest pt = new ParameterTest();//語句(2)
pt.changeInt(a);//語句(3)
System.out.println(a);//語句(4)
Point point = new Point(1,2);//語句(5)
pt.changePoint(point);//語句(6)
System.out.println(point.getX());//語句(7)
System.out.println(point.getY());//語句(8)
String str = "xyz";//語句(9)
pt.changeString(str);//語句(10)
System.out.println(str);//語句(11)
}
}
問題1:當執行完語句(4)后,打印的結果是什么?為什么?
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;//語句(1)
ParameterTest pt = new ParameterTest();//語句(2)
pt.changeInt(a);//語句(3)
System.out.println(a);//語句(4)
Point point = new Point(1,2);//語句(5)
pt.changePoint(point);//語句(6)
System.out.println(point.getX());//語句(7)
System.out.println(point.getY());//語句(8)
String str = "xyz";//語句(9)
pt.changeString(str);//語句(10)
System.out.println(str);//語句(11)
}
}
解答:當執行完語句(4)后,打印的結果是1。分析:首先調用定義 int a = 1;然后調用對象的changeInt(int a)方法,流程轉到changeInt方法里面去,把a的值賦給了方法changeInt的形式參數,changeInt方法里面參數a的值為1,然后執 行性方法體里的語句a = 3,即是將changeInt方法里面參數a的值由1改為3;注意:這個時候對方法changeInt方法里面參數a的值改變并沒有影響到main方法里 面的a的值,為什么?對于原生數據類型來說,它僅僅是把 main方法里面的a的值傳過去,傳值完后,兩者之間沒有任何的關系,你在changeInt方法里面對參數a的改變,對外面main方法的a沒有任何的 影響。因為我只是把值拷貝一份給你,拷貝完以后,你是你的我是我的,兩者之間沒有任何關系。因此,當執行完語句(4)后,打印結果是4。
總結:對八種原生數據類型來說,它們傳遞的時候傳遞的是它們的值(value),是值的拷貝,拷貝過去過后,你是你,我是我,兩者之間無任何關系。所以,方法里面對拷貝過來的值的改變,對被拷貝的原生數據類型沒有任何的影響。
問題2:當執行完語句(7)(8)后,打印的結果是什么?為什么?
解答:當執行完語句(7)(8)后,打印的結果分別是5,6。分析:語句(5)Point point = new Point(1,2),首先生成一個橫坐標是1,縱坐標是2的Point對象,因為有關鍵字new...,point是指向剛生成的這個對象的引用,即是 剛生成的對象的內存地址,接著執行語句(6),調用changePoint方法,它會把引用point傳過去賦值給changePoint(Point point)里面的point.注意:傳的是引用,即是對象的內存地址,接著把對象的x改為5,y改為6,這時對象的橫縱坐標發生了改變,分別變為5和 6。也就是說,在changePoint方法里面,對point所指向的對象的x和y的改變會反應到你外面生成的這個對象,也就是1被改成了5,2被改成 了6。這個對象為什么會改變?這就涉及到 java對引用類型的傳遞方式上,首先語句(5)表示在內存的堆里面生成了一個Point類型的對象,point這個引用它指向堆里面生成的Point類 型的對象,這個對象里x坐標是1,y坐標是2。接著去調用changePoint方法,在調用這個方法的時候,它會把point這個引用傳給 changePoint方法里面的point參數。在java里面,引用在java里面是對象在內存堆里面的地址,它是把對象的地址傳遞到了 changePoint方法里面去了。地址本身也是一個int類型的值,它把地址通過參數的形式傳遞過去。舉例:比如說new Point(1,2)這個對象在內存堆中的地址是1234,那么調用changePoint方法,它傳給changePoint(Point point)里面的point的地址也是1234,changePoint方法外面的引用指向了堆里面生成的Point類型的對象,那么對 changePoint方法里面的參數引用也指向同一個堆里面生成的Point類型的對象,java里面只要有兩個引用它們的地址是一樣的必然指向同一個 對象。所以說當changePoint方法調用的時候,方法里面的引用和方法外面的引用它們指向的是同一個對象,究其原因它們是內存地址的傳遞,兩個引用 的內存地址是一樣的必然指向同一個對象。通過執行changePoint方法里面的語句,把這個引用指向的對象的x改為5,y改為6。然后方法結束,結束 之后,我打印changePoint方法外面這個引用它所指向對象的x坐標和y坐標,因為這兩個引用指向的是同一個對象,所以結果是5和6。
問題3:當執行完語句(11)后,打印的結果是什么?為什么?
解答:當執行完語句(11)后,打印的結果是xyz。分析:語句(9) String str = "xyz";表示str這個引用指向常量"xyz"(在String Pool里面),當執行語句(10)的changeString(String str)方法時,將全局的str引用傳遞給changeString方法里面的str,這時會導致全局的str引用和changeString方法里面的 引用會指向同一個對象"xyz",所以當完成參數傳遞還沒有執行方法里面的語句體的時候,它們的引用是指向同一個對象"xyz"的,接著執行方法體里面的 語句,這時會在String Pool里面生成一個"abc"的對象,同時將方法體里面的str指向String Pool里面的"abc"對象。一個引用在某一時刻始終只能指向一個對象,changString方法外面的str始終是指向"xyz"對象的。所以輸出 的時候始終是"xyz"。
總結: 在java里面,對方法的參數傳遞,不管是原生數據類型還是引用類型,一律是傳值:pass by value。對原生數據類型來說,傳遞的值就是它被賦予的那個值,比如說 int a = 3 就把3這個值傳到方法里面去;引用類型來說,引用本身是一個地址,是一個int類型的內存地址值,所以說它把這個值傳遞到方法里面去傳遞的也是值。
posted on 2009-02-28 10:54 草原上的駱駝 閱讀(533) 評論(0) 編輯 收藏 所屬分類: 其它