不要認爲只要是對象當做實參,傳入到方法中,方法中的變化就能引起實參的變化
有一種例外:在方法中,形參又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;
}
基礎數據類型(int,char,……)傳值,對象類型(Object,數組,容器……)傳引用。
有說java方法參數都是傳值的,理解方式不同而已。引用本身也是值(對象地址)。
傳值方式,傳遞的是值的副本。方法中對副本的修改,不會影響到調用方。
傳引用方式,傳遞的是引用的副本。此時,形參和實參指向同一個內存地址。對引用副本所指向的對象的修改,如修改對象屬性、容器內容等,會影響到調用方。對引用副本本身(對象地址)的修改,如設置爲null,重新指向其他對象,不會影響到調用方。
只要知道傳引用時,也是傳遞的引用的副本,就比較容易理解了。