zoukankan      html  css  js  c++  java
  • 面试题:Java中值传递和引用传递的问题

    随便写写留着自己看。

    首先,Java的参数传递,不管是基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!

    当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。

    下面几个例子帮助理解。

    例1:

    先看一段代码:

     1 public class Test2 {
     2     String str = new String("good");
     3     String str1 = "wtf";
     4     int a = 10;
     5     char[] ch = { 'a', 'b', 'c' };
     6 
     7     public static void main(String[] args) {
     8         Test2 test2 = new Test2();
     9         test2.change(test2.str, test2.str1, test2.ch, test2.a);
    10         System.out.println(test2.str);
    11         System.out.println(test2.str1);
    12         System.out.println(test2.a);
    13         System.out.println(test2.ch);
    14     }
    15 
    16     public void change(String str, String str1, char[] ch, int a) {
    17         str = new String("change ok");
    18         str1 = "change ok";
    19         ch[0] = 'g';
    20         a = 13;
    21     }
    22 }
    1 good
    2 wtf
    3 10
    4 gbc
    输出结果

    分析:

    可以看到String,int的值没有变,char[]数组中的值变了。为什么呢,简单画几个图来说明。

    一、String

    String是不可变类型,传递的是“good”在堆中的地址。

    二、int

    对于基本数据类型,传递的是值的一份拷贝,这份拷贝与原来的值没什么关系。

    这个例子中,类变量a的值是10,没有改变,change方法中a的值由一开始的10变成了13。

    三、char[]

    类似于String中的before情况,不画了,传递的是堆中数组的引用(地址)。

    指向的是同一个数组,所以ch[0]的值被改变了。


    例2: 

     1 public class Test5 {
     2 
     3     public static void main(String[] args) {
     4         // TODO Auto-generated method stub
     5         int[] arr1 = { 1, 2, 3, 4, 5 };
     6         int[] arr2 = arr1;
     7         arr2[1] = 16;
     8         System.out.println("arr1=" + Arrays.toString(arr1));
     9         System.out.println("arr2=" + Arrays.toString(arr2));
    10     }
    11 }
    arr1=[1, 16, 3, 4, 5]
    arr2=[1, 16, 3, 4, 5]
    输出结果

    同样arr1和arr2指向的是同一个数组,所以改变一个的值另一个的值也就变了。

    如果想将数组复制一份,那么应该声明、创建并初始化一个新的数组,然后将原数组中的元素挨个复制到新数组。

  • 相关阅读:
    深度学习框架caffe在macOS Heigh Sierra上安装过程实录
    关于MacOS升级10.13系统eclipse菜单灰色无法使用解决方案
    Struts2中的OGNL详解
    JAR包介绍大全用途作用详解JAVA
    使用SQLQuery 在Hibernate中使用sql语句
    Spring整合Struts的两种方式介绍
    springMVC使用@ResponseBody返回json
    springMVC controller配置方式总结
    安装GitLab出现ruby_block[supervise_redis_sleep] action run
    Mac系统下源码编译安装MySQL 5.7.17
  • 原文地址:https://www.cnblogs.com/kkkky/p/7772517.html
Copyright © 2011-2022 走看看