JAVA中方法的參數傳遞

不要認爲只要是對象當做實參,傳入到方法中,方法中的變化就能引起實參的變化
有一種例外:在方法中,形參又new了一個對象,那麼形參和實參的地址就不一樣了。

//將有序數組轉爲二叉搜索樹
    public static TreeNode sortedArrayToBST(int[] num) {

        if (num.length == 0)
            return null;

        TreeNode root =new TreeNode(0);
        //這裏以爲將root傳入後,引起的改變最終會改變root
        helper(root,num,0,num.length -1);
        return root;

    }

    public static void helper(TreeNode node,int[] num,int i,int j)
    {
        if (i > j) {
            return;
        }

        int mid = (i+j)/2;
        //然而形參new了一個對象,本來形參是實參的一個拷貝,
        //兩者指向同一內存地址,這裏形參new了之後,形參和實參就沒有任何聯繫了
        node = new TreeNode(num[mid]);

        helper(node.left,num,i,mid-1);
        helper(node.right,num,mid+1,j);
    }
//正解
    public TreeNode sortedArrayToBST(int[] nums) {
        if(nums==null||nums.length==0)
            return null;
        return sortedArrayToBST(nums,0,nums.length-1);
    }

    private TreeNode sortedArrayToBST(int[] nums, int left, int right) {
        if(right<left)
            return null;

        int mid=left+(right-left+1)/2;
        TreeNode root=new TreeNode(nums[mid]);

        root.left=sortedArrayToBST(nums,left,mid-1);
        root.right=sortedArrayToBST(nums,mid+1,right);

        return root;
    }

java方法參數傳遞小結

基礎數據類型(int,char,……)傳值,對象類型(Object,數組,容器……)傳引用。

有說java方法參數都是傳值的,理解方式不同而已。引用本身也是值(對象地址)。

傳值方式,傳遞的是值的副本。方法中對副本的修改,不會影響到調用方。

傳引用方式,傳遞的是引用的副本。此時,形參和實參指向同一個內存地址。對引用副本所指向的對象的修改,如修改對象屬性、容器內容等,會影響到調用方。對引用副本本身(對象地址)的修改,如設置爲null,重新指向其他對象,不會影響到調用方。

只要知道傳引用時,也是傳遞的引用的副本,就比較容易理解了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章