[Java] 参数传递
Java参数传递说难也难说简单也简单,今天做了一道编程题,才觉得掌握了Java的参数传递。
Java的参数传递应该分为两部分来讲,一是基本类型的参数传递,比如int, boolean, double, float等类型,这里要特别说明String不是基本类型。而是对象作为参数传递,比如各种内建类和用户自己实现的类。
基本类型参数传递
这个比较好讲,类比C语言,基本类型作为参数传递时,是传递值的拷贝,无论在函数中如何改变这个值的拷贝,原值是不会改变的。
对象作为参数传递
这里就比较令人迷惑了,今天写了一个用遍历单项链表的方法找末尾元素和长度的函数,输入为单项链表的表头元素
LinkedListNode tail = findEndNode(first) public static int findEndNode(LinkedListNode tail) { int length = 1; while (tail.next != null) { length++; tail = tail.next; } return int; }
本以为函数不用返回找到的尾项,输入表头后直接变末尾元素,可惜不是这样。输出后发现表头没有任何改变,和基本类型作为参数传递的情况一样。
实际上Java中对象作为参数传递时,是把对象在在内存中的地址拷贝了一份给了参数,也就是说这里参数传递时的tail是first地址的拷贝,对tail进行操作四号不会影响到first的地址。
进行改进后
public static class Result{
public LinkedListNode tail;
public int length;
public Result(LinkedListNode tail, int length) {
this.tail = tail;
this.length = length;
}
}
public static Result findEndNode(LinkedListNode tail) {
int length = 1;
while (tail.next != null) {
length++;
tail = tail.next;
}
return new Result(tail,length);
}
这样才可以同时返回单项列表长度以及末尾元素
No comments:
Post a Comment