博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中参数传递是值传递,还是引用传递
阅读量:7055 次
发布时间:2019-06-28

本文共 3264 字,大约阅读时间需要 10 分钟。

hot3.png

Java中参数传递是值传递,还是引用传递 博客分类: java  

  函数中参数传递的两种类型 

   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++中也实现类似的改变Personage的方法

[cpp] 

1.     public  void changeAge(Person * p)  

2.      {  

3.      p->age += 10;  

4.      }  

 他也改变 Personage的值。他传入的是一个指针类型,从这个角度可以看出,C++中传递是按值传递的。

  C++中按引用传递的方式是这样的

[cpp] 

1.     public  void changeAge(Person & p)  

2.     {  

3.     p.age += 10;  

4.     }  

 

转载于:https://my.oschina.net/xiaominmin/blog/1599489

你可能感兴趣的文章
Java 的强引用、弱引用、软引用、虚引用
查看>>
zabbix性能简单调优
查看>>
CSS 详细解读定位属性 position 以及参数
查看>>
ed 命令 cat 命令
查看>>
想想你,幸福和快乐就来了
查看>>
html base标签 target=_parent使用介绍
查看>>
nginx实现反向代理,以反向代理tomcat为例
查看>>
团队项目冲刺5
查看>>
poj3254 Corn Fields(状压dp)
查看>>
方便记忆的电话号码
查看>>
+CIMG+彩色图片边缘提取实验记录_canny/hough transfrom
查看>>
BZOJ2179:FFT快速傅立叶(FFT)
查看>>
js文件如何最后加载
查看>>
[操作系统] 线程和进程的简单解释
查看>>
CH5101 LCIS
查看>>
C#面向对象课程两大特性——封装、继承 12月23日
查看>>
Scala-基础-变量与常量
查看>>
spark SQL学习(数据源之json)
查看>>
Ambari Server 配置修改流程
查看>>
阿里架构师都在学的知识体系
查看>>