Java在方法中修改引用是不管用的
可以修改传入对象中的值,
但是如果直接修改传入对象(即引用),方法是不能修改对象的,除非方法使用返回值的方式将改引用后的对象传回给原对象:
nodeleft = gaiYinyong(nodeleft)
从下边的代码可以看出,在不修改对象的引用的情况下,修改都是有效的,但是一旦改了引用,之后的对象.属性修改都会无效:
public class zhengZe { public static void main(String[] args) { zhengZe z = new zhengZe(); TreeNode nodeleft = new TreeNode(4); System.out.println("main中原本的值 = " + nodeleft); z.gaiYingyong(nodeleft); System.out.println("main中的node。val = "+nodeleft); System.out.println(nodeleft.hashCode()); z.gaiZhi(nodeleft); System.out.println("main中改值得node。val = " + nodeleft); System.out.println(nodeleft.hashCode()); } public void gaiYingyong(TreeNode root){ TreeNode node = new TreeNode(2); //可以看出nodeleft修改引用前,修改值有效;在修改引用之后,无效 root.val = 3; root = node; root.val = 2; //可以看出nodeleft修改引用前,修改值有效;在修改引用之后,无效 System.out.println("改引用中的node。val = "+root); System.out.println(root.hashCode()); } public void gaiZhi(TreeNode root){ root.val = 2; System.out.println("改值中的node。val = " + root); System.out.println(root.hashCode()); } } // Definition for a binary tree node. class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } @Override public int hashCode() { return Objects.hash(val, left, right); } @Override public String toString() { return "TreeNode{" + "val=" + val + ", left=" + left + ", right=" + right + '}'; } }
如果深究其原理的话,应该是:gaiYingyong之外的nodeleft依旧指向nodeleft;但是在gaiYingyong之中的nodeleft已经指向了新的引用对象,所有对nodeleft的修改都是对新引用对象的修改,而这个引用修改对方法外的nodeleft不生效。
即:(在无返回的情况下,方法无法修改引用对象)。