`
破晓之刃
  • 浏览: 6034 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类

Java中参数的传递方式只有值传递,没有引用传递

 
阅读更多

 

看以前的学习资料的时候突然发现之前写了这么一篇技术博客,写的很水希望各位大牛勿喷。

 

 

值传递:就是开辟一个新的空间,把原来的空间中所以的内容复制到新的空间中,而改变新的值不影响原来的值的改变。比如变量A传递给变量BA对应的是堆C中存储的数据,如果为值传递则在堆中开辟一块新的内存D,把堆C中的内容复制到D之中,改变B就是改变D中存储的数据与A无关。

 

引用传递:我理解起来感觉这个更像是一种内存空间的传递,就是传递给新的变量指向的还是原来的内存空间,改变新变量的值也就是改变原来变量的值。比如变量A传递给变量BA对应的是堆C中存储的数据,则B通过线2指向A对应的堆C中的数据空间,修改B也等于修改A的堆中的数据。       

 

那么JAVA中参数的传递到底是值传递还是引用传递呢?让我们看下面这一段代码。

//测试类

package test;

 

publicclass test {

   

    privatestaticinta=5;

    privatestatic String str="hello";

   

    public  staticvoid main(String args[]){

       test t=new test();

       System.out.println("before change    "+str);

       t.motifyStr(str);

       System.out.println("after change    "+str);

       System.out.println("before change    "+a);

        t.motifyInt(a);

       System.out.println("after change   "+a);

    }

   

    publicvoid motifyStr(String tochange){

       tochange="hi";

    }

   

    publicvoid motifyInt(int b){

       b=10;

    }

 

}

 

 

测试的结果为:

before change    hello

after change    hello

before change    5

after change   5

 

也就是说java中基本类型的参数传递是值传递。那么自定义类型又是什么情况呢?        

 

package test;

//自定义学生类

publicclass Student {

    String name;

    intage;

   

    public Student(String name){

       this.name=name;

    }

   

    publicvoid setname(String name){

       this.name=name;

    }

 

}

 

//测试类

package test;

 

publicclass test1 {

   

    privatestatic Student stu=new Student("毛杰");

   

    publicstaticvoid main(String args[]){

        test1 t=new test1();

        System.out.println("beforechange   "+stu.name);

        t.modifystu(stu);

        System.out.println("afterchange   "+stu.name);

    }

   

    publicvoid modifystu(Student stu){

       Student stu1=new Student("毛文杰");

       stu=stu1;

        System.out.println("rightnow   "+stu.name);

    }

   

   

 

}

 

结果为:

beforechange   毛杰

rightnow   毛文杰

afterchange   毛杰

 

 

也就是说在java中无论是基本类型还是自定义类型的参数传递都是通过值传递的。也就是图中A作为实参传到B中而B相应的在堆中开辟了一个新的内存块D来复制C中的内容,B的改变并不影响A

 

既然说到了参数传递,那进一步我们来探讨基本类型和自定义类型赋值的区别是值传递还是引用传递。

 

首先我们来测试一下自定义类型:

package test;

 

publicclass test2 {

   

    privatestatic Student stu=new Student("毛杰");

    privatestatic Student stu1=new Student("毛文杰");

 

   

    publicstaticvoid main(String args[]){

       System.out.println(stu.name);

       System.out.println(stu1.name);

       stu=stu1;

       System.out.println(stu.name);

       System.out.println(stu1.name);

       stu.setname("毛杰文");

       System.out.println(stu.name);

       System.out.println(stu1.name);

stu1.setname("毛小杰");

       System.out.println(stu.name);

       System.out.println(stu1.name);

    }

   

 

}

 

结果为:

毛杰

毛文杰

毛文杰

毛文杰

毛杰文

毛杰文

毛小杰

毛小杰

 

说明在赋值的过程中,自定义类型是引用传递的,用图中的示例来说,也就是说把A的值赋值给B等于让B指向A在堆中对应的C的内存空间,AB的改变都会造成堆中C里面存储数据的改变。

 

那么基本类型又是什么情况呢?

 

package test;

 

publicclass test3 {

   

    privatestaticinta=5;

    privatestaticintb=10;

    privatestatic String str="hello";

    privatestatic String str1="hi";

   

    publicstaticvoid main(String args[]){

       System.out.println("a:"+a);

       System.out.println("b:"+b);

        b=a;

       System.out.println("after b=a b:"+b);

       b=12;

       System.out.println("a:"+a);

       System.out.println("b:"+b);

      

       System.out.println("str:"+str);

       System.out.println("str1:"+str1);

       str1=str;

       str1="你好";

       System.out.println("str:"+str);

       System.out.println("str1:"+str1);

    }

}

 

结果是:

a:5

b:10

after b=a b:5

a:5

b:12

str:hello

str1:hi

str:hello

str1:你好             

 

说明在赋值过程中基本类型是值传递,就是新开辟一个内存来复制赋值内容,改变传递后的变量对被赋值变量无影响。

  • 大小: 6.8 KB
分享到:
评论
1 楼 lusheng0596 2013-04-30  
还好。。。。。

相关推荐

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

    在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为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 值传递和引用传递的比较

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

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

    Java的参数传递方式实际上是一种特殊的"值传递",通常被称为"按引用传递对象的引用",这与C++等语言中的引用传递有所不同。以下是对这个主题的详细解释。 在Java中,所有的参数传递都是基于值的,但这涉及到一个...

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

    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 中参数传递方式可以分为按值传递和按引用传递两种 * 在 C++ 语言中,这两种传递方式都是合法的,而在 Java 语言中,只有按值传递是一种合法的传递方式 * 函数内修改了形参指向一个新对象,外面的实参不受影响...

    Java的引用和函数参数传递

    对于对象的参数传递,Java采用的是引用传递的方式。这意味着当你传递一个对象作为参数时,实际上是传递了对该对象的引用,而不是对象本身的副本。因此,在方法内部对这个对象所做的任何改变都会反映到原始对象上。 ...

    Java参数传递PPT

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

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

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

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

    参数传递有两种方式:值传递和引用传递。了解这两种方式的区别是非常重要的,因为它们对程序的执行结果产生了很大的影响。 值传递是指将实际的内存中的值传递给另外一个变量。例如,int a = 3; a 就指向了内存中的...

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

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

    值传递和引用传递

    ### 值传递和引用传递详解 #### 一、引言 ...对于Java而言,基本类型的参数传递采用值传递的方式,而对象类型的参数传递采用的是引用传递的方式。理解这些基础知识有助于编写更高效、更可靠的代码。

    java参数传递

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

    Java参数传递的经典示例

    在Java中,参数传递主要有两种方式:值传递(Value Passing)和引用传递(Reference Passing)。虽然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