1. 程式人生 > >JAVA基本資料型別、引用資料型別-引數傳遞詳解

JAVA基本資料型別、引用資料型別-引數傳遞詳解

1:基本型別的引數傳值

對於基本資料型別,修改這個值並不會影響作為引數傳進來的那個變數,因為你修改的是方法的區域性變數,是一個副本。實參的精度級別應等於或低於形參的精度級別,否則報錯。

class JB{
    void f(int x, int y){
        x=x+1;
        y=y+1;
        System.out.printf("引數x和y的值分別是:%d, %d\n", x, y);
    }
}
public class CS {
    public static void main(String[] arg){
        int
x=10; int y=12; JB jb=new JB(); jb.f(x, y); System.out.printf("main方法中x和y的值分別是:%d, %d\n", x, y); } }
結果:
引數x和y的值分別是:11, 13 main方法中x和y的值分別是:10, 12

2:引用型別的引數傳值

引用型別包括類、陣列以及後面將要學習的介面。當形參是引用型別時,實參傳給形參的值是物件的引用。如果修改形參引用的物件,那麼實參引用的物件也會發生同樣的變化。因為實參的引用拷貝給了形參,所以實參和形參引用同一個物件,對形參引用物件的修改就相當於對實參引用物件的修改。

如果修改的不是形參引用的物件而是形參值本身,也就是讓形參指向其它物件,則實參值和實參引用的物件都不改變。

class A{
    int N;
    A(int n){
        N = n;
    }
    void setN(int n){
        N = n;
    }
    int getN(){
        return N;
    }
}
class A2 extends A{

    A2(int n) {
        super(n);
    }
}
class B{
    void f(A a){
        a.setN(
12); // a = new A2(111); System.out.println("在執行方法f時, 形參a修改了自己的N值"); System.out.println("當前形參mouse的N值: " + a.getN()); } } main B b = new B(); A a = new A(2); System.out.println("在呼叫方法f之前,實參a的N值: "+ a.getN()); b.f(a); System.out.println("在呼叫方法f之後, 實參a的N值: " + a.getN());
結果:

在呼叫方法f之前,實參a的N值: 2
在執行方法f時, 形參a修改了自己的N值
當前形參a的N值: 12
在呼叫方法f之後, 實參a的N值: 12

注意:形參指向其它物件這句話的理解,a = new A2(111);讓mouse又指向了另一個物件,所以他所修改後的值和實參沒有關係,實參的值和引用都不會改變。在程式碼中新加入的A2就是繼承了A,通過方法傳入的是A(a)的物件的引用,把a = new A2(111);那麼之後改變是A2的內容,和A就無關了,所以A(實參)的引用物件和值都不變。

結果:

在執行方法f時, 形參a修改了自己的N值
當前形參a的N值: 111
在呼叫方法f之後, 實參a的N值: 2