`
m635674608
  • 浏览: 5028501 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

    博客分类:
  • 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.     }  

 

  • 大小: 10.4 KB
分享到:
评论

相关推荐

    Java:按值传递还是按引用传递详细解说

    在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点并非完全对立,而是根据不同的角度来描述Java中的参数传递...

    13.java参数传递之引用传递.zip

    13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....

    java值传递与引用传递

    在Java编程语言中,函数参数的传递方式有两种:值传递和引用传递。理解这两种机制对于编写高效、无误的代码至关重要。以下是对这两种传递方式的详细解析。 首先,值传递是指函数调用时,实际参数的值被复制一份传给...

    java参数传递时到底是值传递还是引用传递分享.pdf

    Java中参数传递的方式有两种理解:值传递和引用传递,但这两种说法实际上是对同一种机制的不同角度的描述。下面将详细解释这两种理解方式。 首先,我们来看值传递的理解。在Java中,当一个对象作为参数传递给方法时...

    java参数传递时到底是值传递还是引用传递[归类].pdf

    无论将Java的参数传递称为"值传递"还是"引用传递",重要的是要明白对象的引用不会改变,但对象的内容可以在方法中被修改。这种机制使得Java的代码更安全,避免了不必要的副作用,同时也提供了灵活的编程模型。

    java 值传递和引用传递的比较

    在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...

    Java是值传递,传对象引用也是通过值

    标题“Java是值传递,传对象引用也是通过值”揭示了Java中参数传递的核心概念。Java总是以值传递方式进行,这意味着当你将一个变量作为参数传递给方法时,传递的是该变量所存储值的一个副本。然而,对于对象类型的...

    Java语言中参数值传递和引用传递比较.pdf

    而在引用类型参数的引用传递中,实际参数的引用(地址)被复制给形式参数,对形参对象内容的改变将影响实际参数对象的内容。例如,在一个简单的示例程序中,我们可以看到引用类型参数的引用传递方式: public class...

    62.java引用类型的参数传递.zip

    62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递....

    java中只有值传递

    Java中传递对象时传递的并不是对象中的内容, 而是对象的地址。

    Java的引用和函数参数传递

    - **引用传递的本质**:Java中的引用传递本质上是传递对象的引用,而不是对象本身。这意味着在方法内部对对象所做的任何改变都会影响到原始对象。 - **引用与值的区别**:与基本类型的值传递不同,引用传递不会创建...

    Java面向对象值传递和引用传递

    Java 面向对象值传递和引用传递 Java 面向对象编程中,参数传递是非常重要的一个概念。参数传递有两种方式:值传递和引用传递。了解这两种方式的区别是非常重要的,因为它们对程序的执行结果产生了很大的影响。 值...

    浅析Java引用类型和方法参数传递

    Java中,无论是值类型还是引用类型,在作为方法参数传递时,都遵循着一种被称为“按值传递”的机制。这意味着,当我们将一个变量作为参数传递给方法时,实际上传递的是该变量的一个副本。 ##### 1. 值传递 - **原理...

    Java参数传递PPT

    在值传递中,函数或方法接收的是原始数据类型(如int、double、boolean)参数的副本。例如,如果有一个方法tripleValue,它接受一个double类型的percent并尝试将它乘以3,实际上这个操作不会影响到原始的percent变量...

    java参数传递

    这里详细的说明了,java参数传递的过程,引用传递,值传递

    java方法的参数传递其二.docx

    在本文中,我们将讨论 Java 方法参数传递中的引用类型传递。 在 Java 中,引用类型包括类、接口、数组等,都是对象的引用。这些引用类型在传递过程中,会将对象的引用传递给方法体内的变量,而不是对象的副本。因此...

    11.java参数传递.zip

    11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java...

    值传递和引用传递

    在计算机编程中,值传递和引用传递是两种常见的参数传递方式。这两种传递方式在不同的编程语言中有不同的实现细节,但其核心概念是相似的。本文将详细介绍值传递和引用传递的概念、用法以及它们之间的区别,并通过...

Global site tag (gtag.js) - Google Analytics