一般我们会说Java基本类型采用值传递,对象以及数组采用引用传递。但事实上这只是表面上的现象。实质上,Java都是按值传递引用。(Java中“引用”的概念相当于C++中的指针,可以不断改变值)

一,对象

对象与变量(实例)的区别

对象保存在heap,而变量保存在stack;对象的入口地址是不可预知的,所以程序只能通过变量来访问对象,变量是对象的一个引用。

例1:

class Word {
String word;
public Word(String word){
this.word = word;
}
public void print(){
System.out.println(word);
}
} Word o1, o2;
o1 = new Word("Every Day");
o2 = o1;
o2 = new Word("Every Night!");
o1.print();

结果是Every Day。

第一句o1 = new Word("Every Day");

首先创建一个Word实例,即对象,然后把引用赋值给o1。

第二句o2 = o1;

o1把对象的引用赋值给o2,注意赋的值是对象的引用而不是o1自身的引用。

所以,在第三句o2 = new Word("Every Night!");

就是又创建一个新对象,再把新对象的引用赋值给o2。

因为o1和 o2之间是值传,所以,对o2的改变丝毫不会影响到o1。

例2:

我们为Word类增加了一个新方法

public void setWord(String word){
this.word = word;
} Word o1, o2;
o1 = new Word("Every Day");
o2 = o1;
o2.set Word("Every Night!");
o1.print();

这时的结果是"Every Night!"。

这个并不是变量的改变,因为o1只是保存对象的引用,执行之后,o1还是持有该对象的引用。所以,o1没变,变的是o1所引用的对象。

二,基本类型

栈的数据存储

存在栈中的数据可以共享。如:int a = 3; int b = 3;

编译器会先处理int a = 3,首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3,也是先创建b的引用,之后因为在栈中已经有3这个值,便将b直接指向3。这时如果令a = 4; 那么编译器会重新搜索栈中是否有4,如果没有,将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a的改变不会影响到b的值。

由此可见,Java的基本类型也是按值传递的。

例3:

public class Test
{
public static void main(String[] args)
{
String str = new String ("World");
char ch[] = {'H', 'e', 'l', 'l', 'o'};
change(str,ch);
System.out.print(str+"and");
System.out.println(ch);
}
public static void change (String str, char ch[])
{
str = "Change";
ch[0] = 'C';
}
}

结果是World and Cello

分析:Java中的String是一个特殊的包装类数据,可以用以下两种形式来创建

1)String str = new String ("abc"); 存放在heap

2)String str = "abc"; 存储在stack

比较类里面的数值是否相等时,用equals()方法;测试两个类的引用是否指向同一个对象时,用==。所以,

String str1 = "abc";
String str2 = "abc";
System.out.println(str1== str2); //true
String str1 = new String ("abc");
String str2 = new String ("abc");
System.out.println(str1 == str2); //false

Java按值传递、按引用传递的更多相关文章

  1. 转------深入理解--Java按值传递和按引用传递

    引言 最近刷牛客网上的题目时碰到不少有关Java按值传递和按引用传递的问题,这种题目就是坑呀,在做错了n次之后,查找了多方资料进行总结既可以让自己在总结中得到提高,又可以让其他人少走弯路.何乐而不为? ...

  2. 你真的理解Java的按引用传递吗?

    首先我们来看下面这段代码: public class Test1 { String a = "123"; public static void change(Test1 test) ...

  3. JavaScript 按值传递 & 按引用传递

    (1)值的比较--引用的比较 首先,原始值的比较是值的比较:只有在它们值相等的时候它们才相等 比如简单的 var a1 = 10; var a2 = 10; console.log(a1 === a2 ...

  4. 【转载】解析 java 按值传递还是按引用传递

    原文链接  说明: (1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递. (2):在Java里面只有基本类型和 ...

  5. java学习——java按值传递和按址传递

    先复制一个面试/笔试的题: 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案: 是值传递.Java语言的方法调用只支持参 ...

  6. java按值传递理解

    Java没有引用传递只有按值传递,没有引用传递只有按值传递,值传递. 通过下面代码解释: public class Test { public static void main(String[] ar ...

  7. java按值传递相关理解

    Java没有引用传递只有按值传递,没有引用传递只有按值传递,值传递. 1. public class Test {     public static void main(String[] args ...

  8. java按值传递理解(转)

    ava没有引用传递只有按值传递,没有引用传递只有按值传递,值传递. 通过下面代码解释: 1 public class Test { 2 public static void main(String[] ...

  9. java按值传递?

    原文链接:https://blog.csdn.net/scholar_man/article/details/80900212 在Java中,参数都是按值传递的.被传递到方法中的拷贝值,要不就是一个引 ...

随机推荐

  1. jquery的load()事件和ajax中load()方法的区别

    load事件 当图像加载时,改变 div 元素的文本: $("img").load(function(){ $("div").text("Image ...

  2. mysqldump备份脚本---待完善

    1. 建立备份文件存放目录:/backup/mysql 2. 编写备份脚本: # vim ~/bak.sh ## 写入如下内容: #! /bin/bash DB1_NAME="db1&quo ...

  3. 1076 Forwards on Weibo (30 分)

    1076 Forwards on Weibo (30 分) Weibo is known as the Chinese version of Twitter. One user on Weibo ma ...

  4. 如何缓解DDOS攻击

    1.减少攻击面 (a) reduce the number of necessary Internet entry points,(b) eliminate non-critical Internet ...

  5. API网关Kong系列(二)部署

    部署环境: [OS] centos 6.8(如果是centos6.5,请自行先升级到6.8,否则不支持docker) [Docker] Client version: 1.7.1 Client API ...

  6. Dividing Infinity - Distributed Partitioning Schemes

    This is the second post in a series discussing the architecture and implementation of massively para ...

  7. Delphi Webbrowser使用方法详解(二)

    delphi如何用webbrowser模拟登录网站? 我们就以如何登录博客园来做示例: 1.要登入一个网站,首先要获取网页的源代码,我们可以通过网页菜单--查看--查看源代码来获取. 2.我们找到登录 ...

  8. Static / Const 的概念

    C/C++/Java Static / Const 的概念 这里以C为准,其他语言类似. Static变量是指分配不变(只可分配一次,以后再分配就无效了.)的变量 -- 它的存活寿命或伸展域可以贯穿程 ...

  9. 0_Simple__simpleMultiCopy

    利用 CUDA 的 Overlap 特性同时进行运算和数据拷贝来实现加速. ▶ 源代码.使用 4 个流一共执行 10 次 “数据上传 - 内核计算 - 数据下载” 过程,记录使用时间. #includ ...

  10. openlayers3教材详解及demo(完整)

            openlayers3教材详解及demo(完整)        OpenLayers 3对OpenLayers网络地图库进行了根本的重新设计.版本2虽然被广泛使用,但从JavaScri ...