Java中参数传递是值传递,还是引用传递

  函数中参数传递的两种类型 
   2.1  1.
参数类型为基本类型  int float 等等

    2.参数类型为对象,接口引用类型

  值传递,是指方法接收的是调用者提供的值
  引用传递,是指方法接收的是调用者提供的变量地址
 

  
基本类型传递举例

[java] view plaincopy

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] view plaincopy

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] view plaincopy

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] view plaincopy

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] view plaincopy

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] view plaincopy

1.     public  void changeAge(Person * p)  

2.      {  

3.      p->age += 10;  

4.      }  

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


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

[cpp] view plaincopy

1.     public  void changeAge(Person & p)  

2.     {  

3.     p.age += 10;  

4.     }  

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值