上代码:

public class Demo {
public static void main(String[] args) {
test_1();
test_2();
} public static void test_1(){
String param=new String("aaa");
function(param);
System.out.println(param);
} public static void test_2(){
Instance ins=new Instance();
ins.setValue("111");
function(ins);
System.out.println(ins.getValue());
} public static String function(String param){
param=new String("bbb");
return "ccc";
} public static String function(Instance ins){
ins.setValue("222");
ins=new Instance();
ins.setValue("444");
return "333";
}
}

Instance类:

public class Instance {    

    private String value;

    public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
} }

猜猜打印结果是啥。

aaa
222

解释:

java的基本数据类型是值传递,其他是引用传递
值传递的特点是:传递的是值的拷贝,也就是说传递后就互不相关了。
引用传递特点是:传递的是值的引用,也就是说传递前和传递后都指向同一个内存空间。

Instance是引用类型,是引用传递,传递的是内存空间,在function中被修改成222(h1)了;但是后面ins=new Instance()新开辟了一个内存空间(堆中的新元素h2),在子方法内指向了新开的这个内存地址,但是这个内存地址(或者说这个指针h2)并没有返回给主方法,所以一旦方法执行完毕,新开辟的这个地址(h2)就形成了孤岛(不被任何地方引用);方法外引用的还是原来那个地址(堆中的老元素)。

String虽然也是应用类型,但是是不可变量。所以是 aaa.

在jvm中,堆存放引用对象的地址,栈存放对象的引用和基本数据类型。

下面再看一个例子:

public class Demo {
public static void main(String[] args) {
test_1();
test_2();
} public static void test_1(){
String param=new String("aaa");
function(param);
System.out.println(param);
} public static void test_2(){
Instance ins=new Instance();
ins.setValue("111");
ins=function(ins);//此处接收返回值,相当于把子方法内的ins新指针(h2)返给了主方法内的变量
System.out.println(ins.getValue());
} public static String function(String param){
param=new String("bbb");
return "ccc";
} public static Instance function(Instance ins){
ins.setValue("222");
ins=new Instance();
ins.setValue("444");
return ins;
}
}

此时打印结果为:

aaa
444

补充:

以下代码打印为:

222
111
111
public class Demo {

    private String name;

    public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} public String fun(Demo b, int i, String str) {
b.setName("222");
i = 222;
str = "222";
return str;
} public static void main(String[] args) {
Demo demo = new Demo();
demo.setName("111");
int i = 111;
String str = "111"; demo.fun(demo, i, str); System.out.println(demo.getName());
System.out.println(i);
System.out.println(str);
} }

java关于值传递和引用传递的有趣试验的更多相关文章

  1. Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义

    一.Java中什么叫做引用类型变量?引用:就是按内存地址查询       比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...

  2. java中值传递和引用传递

    最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...

  3. Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  4. java的值传递和引用传递

    昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...

  5. java中方法的参数传递机制(值传递还是引用传递)

    看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参 ...

  6. java 对象传递 是 值传递 还是 引用传递?

    这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...

  7. java参数传递时到底是值传递还是引用传递

    java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...

  8. Java面向对象-方法的值传递和引用传递

    Java面向对象-方法的值传递和引用传递 0 发布时间:『 2016-08-21 14:21』  博客类别:Java核心基础  阅读(197) 评论(0) Java面向对象-方法的值传递和引用传递 方 ...

  9. Does Java pass by reference or pass by value?(Java是值传递还是引用传递) - 总结

    这个话题一直是Java程序员的一个热议话题,争论不断,但是不论是你百度搜也好还是去看官方的文档中所标明的也好,得到的都只有一个结论:Java只有值传递. 在这里就不贴代码细致解释了,让我们来看看一些论 ...

  10. Java值传递和引用传递

    Java总是在讨论是传递还是引用传递,Java没有像C语言那样拥有指针,在看到引用传递和值传递很多的解释之后,更相信引用传递和值传递归根到底都是值传递,只不过引用传递的时候看上去很高大上,其实是把变量 ...

随机推荐

  1. Android之自定义控件-城市选择

    实现效果: 图片素材:           --> 首先, 城市数据字节放在 Json 文件, 就不网络获取了. city.json 存放 Json 数据: { "result&quo ...

  2. Android之QQ新用户注册界面1

    还没到睡觉时间所以再加了一个界面... 问题: 1.下拉列表(因为还没看到这里...) 2.标题栏显示问题 3.按钮的 Enable 设置 .......... 以下是代码: 布局 fragment_ ...

  3. MCMC: The Metropolis Sampler

    本文主要译自 MCMC: The Metropolis Sampler 正如之前的文章讨论的,我们可以用一个马尔可夫链来对目标分布 \(p(x)\) 进行采样,通常情况下对于很多分布 \(p(x)\) ...

  4. 4-Spark高级数据分析-第四章 用决策树算法预测森林植被

    预测是非常困难的,更别提预测未来. 4.1 回归简介 随着现代机器学习和数据科学的出现,我们依旧把从“某些值”预测“另外某个值”的思想称为回归.回归是预测一个数值型数量,比如大小.收入和温度,而分类则 ...

  5. iOS AppStore提交错误收集

    ERROR ITMS-90535: "Unexpected CFBundleExecutable Key. The bundle at 'Payload/创可贴.app/TencentOpe ...

  6. NSXMLParser解析xml格式

    NSXMLParser解析xml格式的数据 用法如下: 首先,NSXMLParser必须继续NSXMLParserDelegate协议 @interface XMLHelper : NSObject ...

  7. python 实现文件下载

    Requests库,高度封装的http库 import requests url = 'http://down.sandai.net/thunder9/Thunder9.0.18.448.exe' f ...

  8. 网页中插入视频(object)

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://down ...

  9. Web性能测试的简介

    一.术语 1.并发用户:并发一般分两种.1)严格意义上的并发,即所有的用户在同一时刻做同一件事情或操作,这种操作一般指做同一类型的业务:2)广义范围的并发,与前者主要区别,尽管多个用户对系统发出了请求 ...

  10. CentOS上安装软件错误提示:configure: error: no acceptable C compiler found in $PATH

    CentOS上安装软件错误提示:configure: error: no acceptable C compiler found in $PATH 因为是centos linux,默认可以采用yum方 ...