Labels

Thursday, April 14, 2016

[Java] 参数传递

[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