java值传递和引用传递(附实例)

观前提示:

本文所使用的IDEA版本为ultimate 2019.1,JDK版本为1.8.0_141。

1.数据类型

1.1 基本数据类型

基本数据类型包括数值型(整数型和浮点型),字符型和布尔型

  1. 整数型:byte,short,int,long
  2. 浮点型:float,double
  3. 字符型:char
  4. 布尔型:boolean

以下程序代码展示了这些基本数据类型的位数、包装类、最大值、最小值。

package testBasicDataType;

public class Test {
    
    

    public static void main(String[] args) {
    
    
        //byte
        System.out.println("数据类型为 :" + Byte.TYPE);
        System.out.println("二进制位数 :" + Byte.SIZE);
        System.out.println("包装类为 :" + Byte.class);
        System.out.println("最大值为 :" + Byte.MAX_VALUE);
        System.out.println("最小值为 :" + Byte.MIN_VALUE);
        System.out.println("\n");

        //short
        System.out.println("数据类型为 :" + Short.TYPE);
        System.out.println("二进制位数 :" + Short.SIZE);
        System.out.println("包装类为 :" + Short.class);
        System.out.println("最大值为 :" + Short.MAX_VALUE);
        System.out.println("最小值为 :" + Short.MIN_VALUE);
        System.out.println("\n");

        //int
        System.out.println("数据类型为 :" + Integer.TYPE);
        System.out.println("二进制位数 :" + Integer.SIZE);
        System.out.println("包装类为 :" + Integer.class);
        System.out.println("最大值为 :" + Integer.MAX_VALUE);
        System.out.println("最小值为 :" + Integer.MIN_VALUE);
        System.out.println("\n");

        //long
        System.out.println("数据类型为 :" + Long.TYPE);
        System.out.println("二进制位数 :" + Long.SIZE);
        System.out.println("包装类为 :" + Long.class);
        System.out.println("最大值为 :" + Long.MAX_VALUE);
        System.out.println("最小值为 :" + Long.MIN_VALUE);
        System.out.println("\n");

        //float
        System.out.println("数据类型为 :" + Float.TYPE);
        System.out.println("二进制位数 :" + Float.SIZE);
        System.out.println("包装类为 :" + Float.class);
        System.out.println("最大值为 :" + Float.MAX_VALUE);
        System.out.println("最小值为 :" + Float.MIN_VALUE);
        System.out.println("\n");

        //Double
        System.out.println("数据类型为 :" + Double.TYPE);
        System.out.println("二进制位数 :" + Double.SIZE);
        System.out.println("包装类为 :" + Double.class);
        System.out.println("最大值为 :" + Double.MAX_VALUE);
        System.out.println("最小值为 :" + Double.MIN_VALUE);
        System.out.println("\n");

        //char
        System.out.println("数据类型为 :" + Character.TYPE);
        System.out.println("二进制位数 :" + Character.SIZE);
        System.out.println("包装类为 :" + Character.class);
        System.out.println("最大值为 :" + (int) Character.MAX_VALUE);
        System.out.println("最小值为 :" + (int) Character.MIN_VALUE);
        System.out.println("\n");

        //boolean
        System.out.println("数据类型为 :" + Boolean.TYPE);
        System.out.println("包装类为 :" + Boolean.class);
        System.out.println("真值为 :" + Boolean.TRUE);
        System.out.println("假值为 :" + Boolean.FALSE);
    }
}

运行结果如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 引用数据类型

包括类、接口类型、数组类型、枚举类型、注解类型,字符串型

2.形参与实参

2.1 函数中使用

  1. 形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。

  2. 实参出现在主调函数中,进入被调函数后,实参变量也不能使用。

2.2 调用

  1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。

  2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。

3.值传递和引用传递

3.1 定义

  1. 值传递
    在方法调用时,传递的参数是按值的拷贝传递。

  2. 引用传递
    在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。

3.2 例子

例1

package testTransfer;

public class Test {
    
    
    public static void main(String[] args) {
    
    
        int num = 10;
        num = 100;
        System.out.println(num);

        String str = "ab";
        str = "bd";
        System.out.println(str);

    }
}

运行结果如下
在这里插入图片描述
解析如下

基本数据类型是直接赋值,引用类型是重新开辟了一块新地址,并将新地址赋值回来。
在这里插入图片描述

例2

package testTransfer;

import java.util.ArrayList;
import java.util.List;

public class Test {
    
    
    public static void main(String[] args) {
    
    
        int num = 10;
        System.out.println("num改变前:" + num);
        changeNum(10);
        System.out.println("num改变后:" + num);

        String str = "ab";
        System.out.println("str改变前:" + str);
        changeStr(str);
        System.out.println("str改变后:" + str);

        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        System.out.println("list.get(1)改变前:" + list.get(1));
        changeList(list);
        System.out.println("list.get(1)改变后:" + list.get(1));

        String[] strings = new String[]{
    
    "a", "b"};
        System.out.println("strings[1]改变前:" + strings[1]);
        changeStrArray(strings);
        System.out.println("strings[1]改变后:" + strings[1]);

        User user = new User();
        user.name = "张三";
        user.age = 30;
        System.out.println("user.name改变前:" + user.name);
        System.out.println("user.age改变前:" + user.age);
        changeUserName(user);
        changeUserAge(user);
        System.out.println("user.name改变后:" + user.name);
        System.out.println("user.age改变后:" + user.age);
    }

    private static void changeNum(int num){
    
    
        num = 100;
    }

    private static void changeStr(String str){
    
    
        str = "abcd";
    }

    private static void changeList(List<String> list){
    
    
        list.set(1,"cd");
    }

    private static void changeStrArray(String[] strings){
    
    
        strings[1] = "cd";
    }

    private static void changeUserName(User user){
    
    
        user.name = "李四";
    }

    private static void changeUserAge(User user){
    
    
        user.age = 31;
    }
}

class User{
    
    
    String name;
    int age;
}

运行结果如下
在这里插入图片描述
解析如下

  1. 基本数据类型形参所传递的值,是这个实际值的拷贝,所以无论对这个拷贝赋其他任何值,都不会改变原值。

  2. 引用类型(除String外),传递的都是存储值的引用地址的拷贝(也就是传递前和传递后的引用相同),改变这个拷贝的引用地址指向的值,会改变原来值的内容。

3.3 结论

  1. 基本数据类型的操作都是值传递。由于原始内容和副本都是存储实际值,并且是在不同的栈区,因此形参的操作,不影响原始内容。

  2. 引用类型的数据进行操作,基本上(String除外)都是“引用传递”(对引用的地址的传递)。 分两种情况,一种是形参和实参保持指向同一个对象地址,则形参的操作,会影响实参指向的对象的内容。一种是形参被改动指向新的对象地址(如重新赋值引用),则形参的操作,不会影响实参指向的对象的内容。

猜你喜欢

转载自blog.csdn.net/weixin_43611145/article/details/103561154
今日推荐