【java】java传值

// Java和C++的参数传值上存在共同的地方,也有不同的地方
// Java 只有传值 , 而C++ 则既有 传值 也有传 引用
// 因此 C++ 可以对地址值进行操作
// 来看个 Java 例子

public class MethodParameterTest {

	public static void main(String[] args) {
		List<String> aa = new ArrayList<String>();
		List<String> bb = new ArrayList<String>();
		aa.add("hi");
		bb.add("hello");

		swapandinc(aa,bb); // 这里把 aa和 bb 这两个对象的地址值传到 swapandinc 方法
		System.out.println("after swapandinc, aa: "+aa);
		System.out.println("after swapandinc, bb: "+bb);
	}
	
	static void inc(List<String> a, List<String> b) {
		a.add(" world");
		b.add(" world");
	}
	static void swapandinc(List<String> a, List<String> b) { 
                // java 中堆栈的概念,进入到方法,会把操作数等压入栈
                // 此时,a 和 b 形参是两个新的对象,各自保存着 main 方法里传进来的 aa 和 bb 的地址值
                // 也就是 a 、aa 指向的是同一个内存空间,而 a、aa两者自身处于不同的内存空间。(a 、aa 都是保存地址的对象)
                System.out.println("before swapandinc, a: "+a);
		System.out.println("before swapandinc, b: "+b);
		List<String> tmp = a;
		a = b;
		b = tmp;
		inc(a,b);
		System.out.println("after swapandinc,  a: "+a);
		System.out.println("after swapandinc,  b: "+b);
	}
}
// 输出结果就可以明显的看到 java 传值的特性 了
// 在 swapandinc 方法里,对 a 和 b 对象进行交换,本质上只是将两者保存的地址进行了交换
// 而 由于 a、b 与 main方法的aa、bb 是分别保存同一个地址的不同对象
// 因此 a 和 b swap行为并不影响 aa、bb 两者所指向的内存空间
// 而在inc 方法里,直接对 a 和 b 他们所指向的对象进行了操作,因此也会影响到 aa、bb 两者所指向的内存空间

output:
before swapandinc, a: [hi]
before swapandinc, b: [hello]
after swapandinc,  a: [hello,  world]
after swapandinc,  b: [hi,  world]
after swapandinc, aa: [hi,  world]
after swapandinc, bb: [hello,  world]
// 下面再看个 C++ 的例子
// 同样的,在C++ 中,如 swap 和 inc 方法所示,传值对于形参与实参,也是两份空间,指向同一份空间
// 对形参的 swap 不会影响实参,但是若对形参所指向的内存空间进行操作则会影响实参
// 而swap1 和 inc1 方法则展示的是C++的引用传值,形参相当于实参的引用,对形参的任何操作都会影响到实参
 #include<stdio.h>
void swap(int *a1,int *b1){   // 这是个传值操作
    int *t=a1;  
    a1=b1;  
    b1=t;  
}  
void inc(int *a, int *b) { // 这是个传值操作
    (*a)++;
    (*b)++;
}
void swap1(int *&a1,int *&b1){  // 这是C++的引用传值
    int *t=a1;  
    a1=b1;  
    b1=t;  
}  
void inc1(int *&a1,int *&b1){  // 这是C++的引用传值
    (*a1)++;
    (*b1)++;
}  
int main(){  
    int x1=100;  
    int x2=200;  
    int *a=&x1;  
    int *b=&x2;  
    printf("%d %d\n",*a,*b);  
    swap(a,b);  
    printf("%d %d\n",*a,*b);  
    inc(a, b); 
    printf("%d %d\n",*a,*b);  
    swap1(a,b);  
    printf("%d %d\n",*a,*b);  
    inc1(a,b);  
    printf("%d %d\n",*a,*b);  
    return 0;  
} 

output:
100 200
100 200
101 201
201 101
202 102

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值