Java按值传递、按引用传递

一般我们会说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 = newString ("abc");
System.out.println(str1 == str2); //false
时间: 2024-10-16 14:59:59

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

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

首先我们来看下面这段代码: public class Test1 { String a = "123"; public static void change(Test1 test) { test.a="abc"; } public static void main(String[] args) { Test1 test1=new Test1(); System.out.println(test1.a); change(test1); System.out.print

JavaScript 按值传递 & 按引用传递

(1)值的比较--引用的比较 首先,原始值的比较是值的比较:只有在它们值相等的时候它们才相等 比如简单的 var a1 = 10; var a2 = 10; console.log(a1 === a2); //true 其次,对象的比较并非值的比较:对象的比较均是引用的比较,当且仅当它们引用同一个基对象时,它们才相等.   即使两个对象包含同样的属性和相同的值,它们也是不相等的.各个索引元素完全相等的两个数组也不相等   比如 var o = {x:1},p={x:1}; console.log

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

前天在做系统的时候被Java中参数传递问题卡了一下,回头查阅了相关的资料,对参数传递问题有了新的了解和掌握,但是有个问题感觉还是很模糊,就是Java中到底是否只存在值传递,因为在查阅资料时,经常看到有人说Java只有值传递,但有人说既有值传递,也有引用传递,对于两个观点个人觉得应该是站的角度不同而得出两个不同的说法,其实两个说法其中的原理是一样的,只要咱们懂得其中的原理,那么至于叫什么也就无所谓了,下面是我在网上看到的一个帖子,解释的感觉挺全面,就转过来,以供以后学习参考: 1:按值传递是什么

java按值传递理解

Java没有引用传递只有按值传递,没有引用传递只有按值传递,值传递. 通过下面代码解释: 1 public class Test { 2 public static void main(String[] args ){ 3 int var = 1 ; 4 f() ; 5 System.out.println(var) ; 6 } 7 public static void f(int newVar ){ 8 newVar = 2 ; 9 } 10 } 执行结果: 1 分析: 当执行 int var

java按值传递?

原文链接:https://blog.csdn.net/scholar_man/article/details/80900212 在Java中,参数都是按值传递的.被传递到方法中的拷贝值,要不就是一个引用或一个变量,取决于原始参数的类型.从现在开始,下面的几条规则将帮助你理解方法中对于参数的修改怎么影响原始参数变量. 在方法中,修改一个基础类型的参数永远不会影响原始参数值. 在方法中,改变一个对象参数的引用永远不会影响到原始引用.然而,它会在堆中创建了一个全新的对象.(译者注:指的是包装类和imm

Java常见笔试题<四>

1.以下Json格式数据,错误的是: A.{company:4399} B.{"company":{"name":[4399,4399,4399]}} C.{[4399,4399,4399]} D.{"company":{[4399,4399,4399]} E.{"company":{"name":4399}} 参考答案:AC 分析:A:Json对象要求属性必须有双引号:C:Json必须有一组有序的键值对组

Java 交换两个变量的数值

一.参数传递方法 为解决标题问题,首先介绍参数传递方法.目前各类程序设计语言的参数传递方法主要有三种: 按值传递 按引用传递 按指针传递 其中按值传递表示方法(函数)接收的是调用者提供的变量的拷贝,不改变参数的值:按引用传递表示方法(函数)接收的调用者提供的变量地址:按指针传递表示方法(函数)接收的是调用者提供的指针的拷贝,不改变指针的值和地址,但可以改变指针所指向的地址. 二.Java参数传递方法 Java提供的参数传递方法,很遗憾只有一种,按值传递.也就是说,方法得到的是所有参数值的一个拷贝

188W+程序员关注过的问题:Java到底是值传递还是引用传递?

在逛 Stack Overflow 的时候,发现了一些访问量像阿尔卑斯山一样高的问题,比如说这个:Java 到底是值传递还是引用传递?访问量足足有 188万+,这不得了啊!说明有很多很多的程序员被这个问题困扰过.实话实说吧,我就是其中之一. 来回顾一下提问者的问题: 我一直认为 Java 是按引用传递的,但是我看一些博客上说不是的.我就纳闷了,Java 到底是值传递还是引用传递?值传递和引用传递有什么区别呢? 如果你也曾被这个问题困扰过,或者正在被困扰,就请随我一起来梳理一下问题的答案.打怪进阶

Java是什么?只需5分钟,了解java必须要知道的知识点

不清楚Java是什么?只需5分钟,了解java必须要懂的知识点 Java吸取了C++面向对象的概念,将数据封装于类中,利用类的优点,实现了程序的简洁性和便于维护性.下面是我收集的Java必备基础知识点,希望对你有用. 1. 简述Java的基本历史 Java起源于SUN公司的一个GREEN的项目,其原先目的是:为家用消费电子产品发送一个信息的分布式代码系统,通过发送信息控制电视机.冰箱等. 2. Java特点 简单的.面向对象的.分布式的.安全的.稳定的.与平台无关的.可解释的.多线的.动态的语言