Java入门:06.Java中的方法--扩展(值传递和址传递与主方法传参)

1 值传递和址传递

值传递

  • 方法调用时,如果传递的实际参数是一个基本类型的数据,那么如果只有形式参数发生改变的话,实参是不会发生变化的,因为我们传递的是变量中具体的数据。

main(){
    int i = 10 ;
    t1(i) ; //值传递
    System.out.println(i); //10
}
public static void t1(int num){
    num = 20 ;
    System.out.println(num) ; //20
}
​

​

Java入门:06.Java中的方法--扩展(值传递和址传递与主方法传参)_第1张图片

就相当于把10赋给i,又把i赋给num,所以,不论num怎样发生变化,i都不会受到影响。

址传递

  • 又称为地址传递,或引用传递

  • 这次,方法在调用时,传递的实参就是一个引用类型的数据了,所以,我们并没有真的将数据传过去,而是只把变量中的引用地址传过去了,这样的话,相当于两个变量指向同一块儿空间,所以一个变量对数据进行操作,自然,另一个变量也看得到。

  • 就像我们之前提到的:
    • 基本类型的数据,比较简单,可以直接存储在变量中

    • 引用类型的数据比较复杂,包含了一堆子数据,不能直接存储在变量中,存储在堆区,会为其分配一个内存地址

    • 我们在使用引用类型数据时,都是通过地址间接引用类型的数据

    • 所谓的地址传递,就是在方法调用时,传递的是引用类型的地址。

  • 所以,哪怕只是形参的内容发生了改变,实参的内容自然也会跟着改变
​main(){
    int[] nums = {10,20,30} ;
    t1( nums ) ;  //址传递
    System.out.println(nums[1]); //200
}
public static void t1(int[] nums){
    System.out.println(nums[1]); //20
    nums[1] = 200 ;
    System.out.println(nums[1]); //200
}

Java入门:06.Java中的方法--扩展(值传递和址传递与主方法传参)_第2张图片

类似于值传递的址传递

main(){
    int[] nums = {10,20,30} ;
    t1( nums ) ;  //址传递
    System.out.println(nums[1]); //20
}
public static void t1(int[] nums){
    System.out.println(nums[1]); //20
    nums = new int[]{100,200,300}
    System.out.println(nums[1]); //200
}
​
像这段代码,表面上确实是把数组的引用地址传过去了,但到t1方法中,nums又指向了新的引用地址,所以之后无论怎样对其进行操作,nums中的值都不会发生改变了。
换到主方法中,我们能看到更直观一些:​
​
//main方法调用t1方法时,其实就相当于将t1方法中的代码拿到主方法中
main(){
    int[] nums1 = {10,20,30} ;
    {
        nums = nums1 ;
        System.out.println(nums[1]); //20
        nums = new int[]{100,200,300}
        System.out.println(nums[1]); //200
    }
    System.out.println(nums1[1]) ;//20
}

Java入门:06.Java中的方法--扩展(值传递和址传递与主方法传参)_第3张图片

2 主方法传参

  • 主方法是Java程序的入口

  • 是由 jvm自动调用。

  • 在程序执行的过程中,我们也可以调用主方法(都看需求)

  • 在运行java程序时,我们通过命令行指定jvm调用主方法时要传递的参数。

    • 默认情况下,jvm调用主方法时,传递的是一个0长度的数组。

在cmd中进行运行时,如果我们这样写:java Test1 zs ls
​
就相当于,在执行Test1程序时,告诉jvm,将zs和ls作为参数,传递给main方法。
jvm内部会将zs和ls组成一个String[],将这个String[]传递给main方法
public static void main(String[] args){
        for(int i=0;i 
  

即可对该数组进行输出操作。

好了,经历了方法系列的最后一篇文章,那么本期的内容就到这里啦,如果存在哪些疑问或问题欢迎大家指出,我们下期再见~

你可能感兴趣的:(java,开发语言)