再谈Java传参

把一个变量带进一个方法,该方法执行结束后,它的值有时会改变,有时不会改变。一开始会觉得--“好神奇呀”。当我们了解java内存分析的知识后,一切都是那么简单明了了--“不过如此”。但是今天的实验课,对于引用变量,我犯了一个错误,下面是代码的简化--

void method(int a[])
{
    int temp[]={1,2,3,4};
    a[0]=5;
    a=temp;
}

在这里,我试图把临时数组变量的值赋给a,从而改变实参的值。如果你觉得是不可以的,那么就没有看下去的必要的。事实上当然是不可以的。

方法传参,分传值和传址,基本数据类型变量的传参传的是值;引用变量传参传的是地址。传入的参数,实际是实参的一份拷贝。因为,当我们调用一个方法时,逻辑上,jvm会开辟一个我们称之为栈区的内存,当方法运行结束后,这段内存也就被释放了。我们传入的实参的拷贝的生命也仅限于这段栈区,这便是局部变量的宿命。对于基本数据变量,由于它的值是存在栈区的,且与调用该方法的函数的栈内存是独立的,所以影响不到该函数。引用变量的值是地址,它指向堆区的某个地址,这是一个被共享的内存。我们对其的操作就是操作堆区的数据(继续看下文,这句话是不严谨的)。

这是之前我对传参的理解。用它来理解今天的问题,也是没有问题的。但却忽略了一个问题。

既然传入引用变量是传址的,那么上面的代码为什么不能如愿改变它的值呢?

当我们注意到上文说,传参实际是实参的一份拷贝,而且,引用变量也是存在栈区的。那么,我的“a=temp”是在栈区上改变数据(他们的值仅是地址,不能影响堆内存的对象),是拷贝而来的数据。方法执行结束,它也就毫无意义了。

于是:被调用的方法,在堆内存的操作在方法执行结束后才是有效的。对于引用变量,重在它指向的对象,而不是它本身。

价值不高,重在记录。

时间: 2024-10-09 11:57:37

再谈Java传参的相关文章

java 传参方式--值传递还是引用传递

java 传参方式--值传递还是引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递.写它是为了揭穿普遍存在的一种神话,即认为 Java 应用程序按引用传递参数,以避免因依赖“按引用传递”这一行为而导致的常见编程错误. 对此节选的某些反馈意见认为,我把这一问题搞糊涂了,或者将它完全搞错了.许多不同意我的读者用 C++ 语言作为例子.因此,在此栏目中我将使用 C++ 和 Java 应用程序进一步阐明一些事实. 要点 读完所有的评论以后,问题终于明白了

沉淀再出发:再谈java的多线程机制

沉淀再出发:再谈java的多线程机制 一.前言 自从我们学习了操作系统之后,对于其中的线程和进程就有了非常深刻的理解,但是,我们可能在C,C++语言之中尝试过这些机制,并且做过相应的实验,但是对于java的多线程机制以及其中延伸出来的很多概念和相应的实现方式一直都是模棱两可的,虽然后来在面试的时候可能恶补了一些这方面的知识,但是也只是当时记住了,或者了解了一些,等到以后就会变得越来越淡忘了,比如线程的实现方式有两三种,线程池的概念,线程的基本生命周期等等,以及关于线程之间的多并发引起的资源的抢占

java传参调用fortran的exe可执行文件

java传参调用fortran的exe可执行文件 需求:最近有一个任务,其核心部分主要是整合java和fortran之间的数据交互:java调用fortran的exe可执行文件,同时传递参数到fortran里面,以便fortran后续的处理, 下面我抽离出传参的代码案例 一.fortran端 main.f90 生成 .exe 可执行文件 program mainimplicit none integer :: getcwd,status,sh,kk,getargcharacter(len=64)

使用java传参调用exe并且获取程序进度和返回结果的一种方法

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在某个项目中需要考虑使用java后台调用由C#编写的切图程序(exe),并且前端能够获取到切图的进度和相关描述信息. 2.解决思路 a.首先改造切图程序为接受参数从Main函数传递. b.编写java后台传参调用exe的函数. c.解决通信问题. 3.具体实现 3.1改写C#窗体程序 C#中的入口程序为Main函数,其中Main函数默认是没有参数的,如果添加参

Java传参

1.  如果参数是基本数据类型(int.long等),传值.方法内部改变参数值,外部值不变. 2.  如果参数是对象类型,传地址.方法内部改变对象值,外部对象值改变.但是,如果方法内部调用new重新构建参数对象,外部对象仍然记录构造前的对象值.(在不同函数中,所有改String的改变可能都要重构String,或者说所有String都是传值的,在这点上,相当于String为基本类了) Java参数传值还是传引用 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值

再谈Java中类的继承

上篇博客谈到了Java中类的继承,但是那些远远不能满足我们在实际操作中的需要,那么怎么才能让子类的功能更强大,并且具有父类的属性呢? 一: 父类 1 public class A { 2 3 final String name="A"; 4 5 void A1(){}; 6 } 子类 1 public class AA extends A{ 2 3 String name="AA"; 4 5 void AA1(){}; 6 7 public static void

String的按值传递,java传参都是传值

java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? String和int参数传递是按值传递还是引用传递? 一道面试题目,String的传递: public String change(String s){ s = "222"; return s; } public static void main(Stirng[] args){ String s = "111"; change(s); sout(s); } 我看到题目愣了一下,本来不假思考的结果是1

再谈Java原子变量以及同步的效率 -- 颠覆你的人生观

思维定视让我们觉得原子变量总是快过同步操作的,笔者也是一直这么认为,直到一次实现一个ID生成器的过程中的一次测试偶然发现了并非都这么回事. 测试代码: import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class ConcurrentAdder { private static final AtomicInteger ATOMIC_

String的按值传递,java传参都是传值(转)

转载请注明出处:http://www.cnblogs.com/woshimrf/p/java-transfer-value.html#3768037 目录 首先是String.然后是StringBuffer同理,看自己创建的对象people java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? String和int参数传递是按值传递还是引用传递? 一道面试题目,String的传递: 1 2 3 4 5 6 7 8 9 public String change(String s){