`

Java方法参数传递的问题,有点看头

阅读更多
在Java当中,构造方法、函数,传递参数是最为常见的,有时候我们希望能带出计算结果,重新赋给传入值,实现对变量赋值的更新。
假如一个方法试图将一个参数值增加至原来的3倍,我们可能会写下如下代码:
class PassValue 
{   //方法是否对参数构成影响?------传值的方式
      public static void main(String[] args) 
     {
            int i = 10;
            callByValue(i);
            System.out.println(i);
      }   
     //申明一个没有返回值的【值调用】静态方法;     
       static void callByValue(int n)
      {
             n = n*3;
      }
}

结果:返回10,也就是说,我们的i没有受到任何的影响;
其原理是i=10;当执行方法的时候,n拷贝了i的数值,并形成一个副本n=10;执行n=n*3;后n的值变为30;方法结束后,n不再使用,对我们先前的i没有任何的影响;

--------------------------------------------------------------------
class PassValue 
{   //方法是否对参数构成影响?------传值的方式
      public static void main(String[] args) 
     {
            int i = 10;
            i=callByValue(i);//我们强行赋值;
            System.out.println(i);
      }   
     //申明一个没有返回值的【值调用】静态方法;     
       static int callByValue(int n)
      {
             n = n*3;
             return n;
      }
}

结果:返回30, 在该示例代码中,通过把修改以后的参数n的值返回,来为变量i赋值,强制修改按值传递参数的值,从而达到修正参数值的目的;

--------------------------------------------------------------------
对于引用型传值和数值型传递的对比:
class PassValue 
{
      public static void main(String[] args) 
     {
          int i = 10;
          callByValue(i);
          System.out.println("值调用下i值:"+i);
	 System.out.println("-------------------------------------");


	 test person=new test(2);//初始化getmoney 为2;
            System.out.println("先前的person的getmoney:"+person.getmoney);
	  callByReference(person);
			 
           System.out.println("使用callByReference(person)之后的person的getmoney:"+person.getmoney);
           System.out.println("代入person后的方法使得person的值发生了改变!");


      }   
//申明一个没有返回值的【值调用】静态方法;     
       static void callByValue(int n)
      {
		  
             n= n*3;
      }

//申明调没有返回值的【调用引用】静态方法
      static void callByReference(test i)
      {
            i.add(i.getmoney);
      }
}

class test //构造一个 test 类,有一个getmoney的int属性,它的方法使原始赋值增为原来的3倍;
{      int getmoney;
	    public test(int n)
	    {
                 getmoney=n;
	     }
	    public void add(int a)
	    {
	        getmoney=a*3;
	    }

}

值调用下i值:10
先前的person的getmoney:2
使用callByReference(person)之后的person的getmoney:6
代入person后的方法使得person的值发生了改变!

--------------------------------------------------------------
上面的一段程序有点绕,其实简单的看就是int i = 10; callByValue(i);后i值没有变;而test person=new test(2);callByReference(person);后person的值变了;

给大家来个更简单的说明问题:
class PassValue 
{
     public static void main(String[] args) 
     {
         int a = 10;
         int[] b = {1,2,3};
         test(a,b);
         System.out.println(a);
         System.out.println(b[0]);

     }        
     static void test(int n,int[] t)
     {
         n = 0;
         t[0] = 12345;
      }

}

输出结果为:10 12345
同样都是传入参数,为什么变量a的值未改变,而b[0]的值发生了改变呢?
在参数传递时,一般存在两种参数传递的规则,在Java语言中也是这样,这两种方式依次是:

l 按值传递(by value)

按值传递指每次传递参数时,把参数的原始数值拷贝一份新的,把新拷贝出来的数值传递到方法内部,在方法内部修改时,则修改的时拷贝出来的值,而原始的值不发生改变。

说明:使用该方式传递的参数,参数原始的值不发生改变。

l 按址传递(by address)

按址传递指每次传递参数时,把参数在内存中的存储地址传递到方法内部,在方法内部通过存储地址改变对应存储区域的内容。由于在内存中固定地址的值只有一个,所以当方法内部修改了参数的值以后,参数原始的值发生改变。

说明:使用该方式传递的参数,在方法内部修改参数的值时,参数原始的值也发生改变。

在Java语言中,对于那些数据类型是按值传递,那些数据类型是按址传递都作出了硬性规定,如下所示:

l 按值传递的数据类型:八种基本数据类型和String

l 按址传递的数据类型:除String以外的所有复合数据类型,包括数组、类和接口

文笔不好,大家凑合看看咯。



分享到:
评论

相关推荐

    java学习系统(经典例题,完数,九九乘法表,百鸡问题等详细解答,精简代码)

    Java学习系统是一个专门为Java初学者和进阶者设计的资源集合,它包含了各种经典编程例题的详细解析,以及一些有趣的数学问题的编程实现,如完数问题、九九乘法表和百鸡问题等。这些例子是学习Java语言的重要实践部分...

    有看头软件

    【有看头软件】是一款专为用户提供远程视频监控服务的应用程序,主要针对的是家庭和小型商业场所的安全需求。通过这款软件,用户可以实时查看、回放安装了相应摄像头的地点的视频流,无论身处何处都能确保家或工作...

    100例精彩过渡句让材料更有看头

    100例精彩过渡句让材料更有看头

    让公文材料有看头、有亮点、有味道的提纲.pdf

    让公文材料有看头、有亮点、有味道的提纲.pdf

    让公文材料有看头、有亮点、有味道的提纲.doc

    让公文材料有看头、有亮点、有味道的提纲.doc

    vc_cxml.rar_CXML_XML VC_xml文件_有看头

    一个很简单的XML封装类,功能还不够完善,希望能够在大家的提点下继续完善,源文件中包含有三个类(具体看头文件):CXml XML文件类CXmlNode XML结点类CXmlNodes XML结点集合类

    效率至上的企业市场,协同沟通工具创业无有看头? .doc

    多层级的管理结构和分散的信息系统导致信息传递效率低下,信息失真,甚至可能因为人为因素导致沟通障碍。此外,传统文化中的等级观念也在一定程度上影响了企业的沟通效率,上级与下级之间的单向沟通削弱了信息交流的...

    TL-C430+产品固件升级方法

    详细的介绍了台电C430 估计升级的方法过程清晰有看头

    五笔字根表

    12. R区(折中区):“白手看头三二斤”,如“白”、“手”、“头”以及“三”和“二”的字根。 13. E区(折下区):“月彡(衫)乃用家衣底”,涉及到“月”、“彡”(“衫”字的一部分)以及“家衣底”(“衤”)...

    大班数学教案《跳绳计数》含反思.docx

    3. 幼儿分组实践,尝试不同的计数方法,并记录下来,如看脚、看头、看手臂等,集体讨论哪种方法最有效。 4. 分组学习和实践跳绳计数,鼓励创新计数策略。 5. 讨论其他通过计数决定结果的运动项目,扩展数学的应用...

    王码五笔86版字根表图

    白手看头三二斤是一个基本字根,用于表示汉字“白”的上半部分。该字根可以与其他字根组合,形成更多的汉字。 11.E 月彡(衫)乃用家衣底 月彡是一个基本字根,用于表示汉字“月”的左边部分。该字根可以与其他...

    各种密码破解 查看IP

    破解各种密码 2.2面纱半试一试 破解各种系统

    ZLG7289B驱动代码

    本文将深入探讨ZLG7289B驱动代码的结构、功能和使用方法。 ZLG7289B芯片是一种专为TFT LCD显示屏设计的控制器,它提供了丰富的接口选项和强大的图形处理能力。驱动代码主要包含两部分:头文件和C源文件。头文件定义...

    高中数学讲义微专题92 算法——程序框图.pdf

    程序框图是算法的图形表示方法,它能帮助我们更好地理解程序的结构和流程。在高中数学中,算法——程序框图是一个重要的知识点,主要考察学生对循环结构的理解和计算能力。程序框图通常包含若干个框,每个框可以是一...

    诺信威视摇头摄像机固件.bin

    诺信威视摇头摄像机固件720p编程器正常读出固件8M。诺信威视摇头摄像机固件720p编程器正常读出固件8M。

    调试AMR的好工具(AMR文件的头)

    使用方法:使用fopen打开本文件,用append的方式写入,当然你不能再覆盖这个头了,之后拷贝出来就可以播放了,如果你数据对的话.AMR压缩比高,协议相对简单,看过说明的人就知道这个头是对的了,不会看头的人,应该不是搞AMR...

    摄像头资源

    1. 图像采集:了解如何初始化摄像头,设置参数,以及如何开始和停止图像捕获。 2. 图像处理库:例如OpenCV,它是计算机视觉领域常用的库,提供了丰富的图像处理函数。 3. 颜色空间转换:理解如何从RGB到灰度的转换,...

    一年级音序查字法练习题.doc

    音序查字法是汉字查字典的基本方法之一,尤其对于初学者来说,掌握这种方法能够帮助他们快速查找不认识的汉字。以下是对音序查字法的详细解释和练习题解析: 1. **音序查字法口诀**: - "音序查字要记牢,先把大写...

    如何分配局域网内网的所有IP 抢占所有IP不分配的方法

    在公司里使用网络,总会出现你用几号线我用几号线的问题,同一号线使用的人多了网速也会有影响,自己的局域网怎样才能保护所有的ip,不...这种同一网卡添加多IP的事,虽然技术不太新颖,但是换个思考方法还是有看头的

    Jide 开源库 共享

    Jide开源库 让你的Swing界面更有看头

Global site tag (gtag.js) - Google Analytics