zoukankan      html  css  js  c++  java
  • java为什么只有值传递?

    首先看一下按值传递和按引用传递的区别??

    按值传递:方法接收的是调用者提供的值

    按引用传递:方法接收的是调用者提供的变量地址

    Java程序设计语言总是采用按值调用。也就是说方法得到的是所有参数值的一个拷贝。也就是说方法不能修改传递给他的任何参数变量的内容。

    下面通过3个例子说明

    例子1

     1 public static void main(String[] args) {
     2     int num1 = 10;
     3     int num2 = 20;
     4 
     5     swap(num1, num2);
     6 
     7     System.out.println("num1 = " + num1);
     8     System.out.println("num2 = " + num2);
     9 }
    10 
    11 public static void swap(int a, int b) {
    12     int temp = a;
    13     a = b;
    14     b = temp;
    15 
    16     System.out.println("a = " + a);
    17     System.out.println("b = " + b);
    18 }

    结果:

    1 a = 20
    2 b = 10
    3 num1 = 10
    4 num2 = 20

    通过上面例子,我们已经知道了一个方法不能修改一个基本数据类型的参数,而对象引用作为参数就不一样。

    例子2

     1 public static void main(String[] args) {
     2         int[] arr = { 1, 2, 3, 4, 5 };
     3         System.out.println(arr[0]);
     4         change(arr);
     5         System.out.println(arr[0]);
     6 }
     7 
     8 public static void change(int[] array) {
     9     // 将数组的第一个元素变为0
    10     array[0] = 0;
    11 }

    结果

    1 1
    2 0

    array 被初始化 arr 的拷贝也就是一个对象的引用,也就是说 array 和 arr 指向的时同一个数组对象。 因此,外部对引用对象的改变会反映到所对应的对象上。

    通过 例子2我们已经看到,实现一个改变对象参数状态的方法并不是一件难事。理由很简单,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。

    例子3

     1 public class Test {
     2 
     3     public static void main(String[] args) {
     4         // TODO Auto-generated method stub
     5         Student s1 = new Student("小张");
     6         Student s2 = new Student("小李");
     7         Test.swap(s1, s2);
     8         System.out.println("s1:" + s1.getName());
     9         System.out.println("s2:" + s2.getName());
    10     }
    11 
    12     public static void swap(Student x, Student y) {
    13         Student temp = x;
    14         x = y;
    15         y = temp;
    16         System.out.println("x:" + x.getName());
    17         System.out.println("y:" + y.getName());
    18     }
    19 }

    结果

    x:小李
    y:小张
    s1:小张
    s2:小李

    方法并没有改变存储在变量 s1 和 s2 中的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。

  • 相关阅读:
    佛经中的 云何梵 什么意思?
    论节拍器的重要性,一定要习惯使用。
    Linux文件系统分析
    uboot启动内核分析
    Linux内核启动流程分析
    Linux内核配置机制与编译过程分析
    Linux内核源码目录结构分析
    Kconfig文件分析
    Ubuntu下安装make
    Ubuntu下交叉编译器gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12的安装和使用
  • 原文地址:https://www.cnblogs.com/wylwyl/p/10244779.html
Copyright © 2011-2022 走看看