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
}
就相当于把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
}
类似于值传递的址传递
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
}
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<args.length;i++){ String s = args[i] ; System.out.println(s); } }
即可对该数组进行输出操作。
好了,经历了方法系列的最后一篇文章,那么本期的内容就到这里啦,如果存在哪些疑问或问题欢迎大家指出,我们下期再见~