函数中参数传递的两种类型 2.1 1.参数类型为基本类型 如 int float 等等
2.参数类型为对象,接口引用类型
值传递,是指方法接收的是调用者提供的值 引用传递,是指方法接收的是调用者提供的变量地址 基本类型传递举例
[java]
1. public class PersonDemo
2. {
3. public static void main(String[] args)
4. {
5. int n =100;
6. System.out.println(n);
7. changeN(n);
8. System.out.println(n);
9. }
10.
11. public static int changeN(int a)
12. {
13. return a = a+1;
14. }
15. }
相信大家都知道结果: 100 100 从这里,我们都可以看出java中方法的参数传递是按值传递的。
2.2 参数类型为对象类型 如Person 例子一
[java]
1. public class PersonDemo
2. {
3. public static void main(String[] args)
4. {
5. Person p = new Person();
6. p.age = 10;
7. System.out.println("传递前age=" +p.age);
8. changeAge(p);
9. System.out.println("传递后age=" +p.age);
10. }
11. public static int changeN(int a)
12. {
13. return a = a+1;
14. }
15. public static void changeAge(Person per)
16. {
17. per.age += 10;
18. }
19. }
20.
21. class Person
22. {
23. int age;
24. }
输出结果: 传递前age=10 传递后age=20 可能有人会想 例子一这里传递的是对象的引用。
例子二
[java]
1. public class PersonDemo
2. {
3. public static void main(String[] args)
4. {
5. Person p = new Person();
6. p.age = 10;
7. System.out.println("传递前age=" +p.age);
8. changePerson(p);
9. System.out.println("传递后age=" +p.age);
10. }
11. public static int changeN(int a)
12. {
13. return a = a+1;
14. }
15. public static void changeAge(Person per)
16. {
17. per.age += 10;
18. }
19. public static void changePerson(Person per)
20. {
21. Person p1 = new Person();
22. p1.age = 50;
23. per =p1;
24. }
25. }
26. class Person
27. {
28. int age;
29. }
输出结果 传递前age=10 传递后age=10 可能有人会想 例子二中这里传递的是对象的引用的一个复制。 我的理解是这样的。
实参是 Persion p =new Person();
形参是 Person per = p ;(一个实参的引用拷贝)
对于第二种参数传入类型为对象的情况,解释有3种 说法1 参数是按引用传递的,对于说法1 还有两
种解释, 解释1 引用传递时是传入对象的引用 解释2 引用传递时是传入对象引用的复制:就相当于这个Person per = p; 说法2 参数是按值传递
到底关于对象类型的参数,java中是按什么传递的, 其实java中不管是对象参数还是基本类型参数,都是按值传递的。
我们可以对方法中参数某些值进行打印 比如 Hashcode 这是部分代码 Person类可以参考上面定义的。
[java]
1. public class PersonDemo
2. {
3.
4. public static void main(String[] args)
5. {
6. Person p = new Person();
7. System.out.println("传递前hascode=" +p.hashCode());
8. hc(p);
9. }
10.
11. public static void hc(Person per)
12. {
13. System.out.println("传递后hascode=" +per.hashCode());
14. }
15. }
输出结果 传递前hascode=29855319 传递后hascode=29855319 我们可以看出 参数中传递进来的对象的hashcode和参数外面的一样。 我们再看一个例子
[java]
1. public class PersonDemo
2. {
3. static Person CP = new Person();
4. public static void main(String[] args)
5. {
6. equalPer(CP);
7. }
8.
9. public static void equalPer(Person per)
10. {
11. System.out.println("比较对象结果:" +(per == CP));
12. }
13. }
输出结果 比较对象结果:true 用==进行比较, 我们一直都认为是比较的值相等,而不是内容。 查看JDK文档中队 hashcode方法的描述,有这么一段话 实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。 这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。) 通过上面的分析,关于对象传递,传递的是对象的一个引用(这里的引用跟c++中的引用不是一回事),这里的引用对象 是"该对象的内部地址转换成一个整数" ,其实就是一个整数。 所以我们可以肯定了java中不管是对象参数还是基本类型参数,都是按值传递的。 附带说明: c++里面关于对象的一些知识 c++也是面向对象的语言,c++里面建立对象的方法是 :Person * p1 = new Person; new出来返回的是一个对象的指针,java中没有指针这个说法。 而这个栈上的指针p也是指向堆上的new Person对象。 貌似跟java很类似,的确很类似 如果你在c++中也实现类似的改变Person中age的方法
[cpp]
1. public void changeAge(Person * p)
2. {
3. p->age += 10;
4. }
他也改变 Person中age的值。他传入的是一个指针类型,从这个角度可以看出,C++中传递是按值传递的。
C++中按引用传递的方式是这样的
[cpp]
1. public void changeAge(Person & p)
2. {
3. p.age += 10;
4. }