`
j小虫
  • 浏览: 18828 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java的值传递与引用传递

    博客分类:
  • java
阅读更多

对于如下代码:

public class Test {
    
    public static void main(String[] args) {
        int i = 0 ;
        Test test = new Test();
        test.valueMethod(i);
        System.out.println(i);       
    }
    
    private void valueMethod(int a){
        a = 5;
    }
}
 

 

运行结果是0,由于参数是基本类型,因此调用时我们传递的是一个值,所以是java中的值传递,它传递的是一个值的副本,因此,在这个局部方法中对传进来的值的修改是不会影响外部变量的,它修改的是副本的值而不是外部成员i的值。

 

而对于如下代码

public class Test {
	
	public static void main(String[] args) {
		DO dos = new DO();
		dos.setX1(3);
		Test test = new Test();
		test.paraMethod(dos);
		System.out.println(dos.getX1());
		
	}
	private void paraMethod(Object o){
		DO oo = (DO)o;
		oo.setX1(5);
	}
}

class DO{
	private int x1 ;
	public int getX1() {
		return x1;
	}
	public void setX1(int x1) {
		this.x1 = x1;
	}
	
}

 运行结果却是5,这是因为值传递时候,传递的是值的拷贝,而引用传递时,也是引用的拷贝,它意味着外部变量和局部变量的指针指向同一个对象,当你在局部方法内修改那个对象的值时,实际上是修改的堆中的值,因此外部变量的值也修改了

 

 

再看如下代码:

public class Test {
	
	public static void main(String[] args) {
		DO dos = new DO();
		dos.setX1(3);
		Test test = new Test();
		test.paraMethod(dos);
		System.out.println(dos.getX1());
		
	}
	private void paraMethod(Object o){
		DO oo = new DO();
		oo.setX1(8);
		o = oo;
	}
}
class DO{
	private int x1 ;
	public int getX1() {
		return x1;
	}
	public void setX1(int x1) {
		this.x1 = x1;
	}
	
}

 它的运行结果还是3,有的人就奇怪了,这个和第二个不是类似么,为什么这里没有修改它的值呢

其实知道画堆栈图的人把这里画出来就明白了

 

 

dos是栈中的一个引用,它指向了堆中的x1所代表的值3

1.当你用上面第2段代码时,实际上是拷贝了一个引用传递到局部方法中,我们暂且称这个引用为dos2,dos和dos2都指向了堆中的3,当我们修改dos2的值的时候实际上就是把这个3给改成了5,因此,dos的x1这个值就变成了5。

2.当你用上面第3段代码时,实际拷贝的是一个引用传递到局部方法中,我们也暂且称这个引用为dos2,dos和dos2都指向了堆中的3,现在我在局部方法体中重新定义了一个oo,这个oo又是一个栈中的指针,它指向了堆中的另外一个值为8的堆空间,我把这个引用赋给dos2时,实际上就只是把dos2的指针给变了,而dos继续指向它原来的3,因此最后的结果就为三拉。

 

 

最后总结一下,目前java传递有2种观点

一种是值传递观点,他们认为java只有值传递,没有引用传递,就算参数是一个引用,它也是引用值的副本,所以是值传递

另一种是基本类型为值传递,引用类型就是引用传递。

 

我个人比较支持第一种,不过这个一直都有争议,没有正确答案~~~~。

分享到:
评论

相关推荐

    java值传递与引用传递

    因此,尽管看似是引用传递,但对`String`类型的处理结果与值传递类似。 总结来说,Java中的参数传递主要有以下特点: 1. 基本数据类型按值传递,函数内部无法改变实际参数的值。 2. 引用类型看似按引用传递,实际上...

    java 值传递和引用传递的比较

    在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...

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

    ### Java中的按值传递与按引用传递详解 #### 一、引言 在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点...

    13.java参数传递之引用传递.zip

    13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....

    java值传递和引用传递详解

    Java中的参数传递方式主要有两种:值传递和引用传递。理解这两种机制是编程中至关重要的,因为它们直接影响到函数内部如何改变或操作传入的数据。 **值传递**在Java中是基本数据类型(如int, double, char等)的...

    Java面向对象值传递和引用传递

    Java 面向对象值传递和引用传递 Java 面向对象编程中,参数传递是非常重要的一个概念。参数传递有两种方式:值传递和引用传递。了解这两种方式的区别是非常重要的,因为它们对程序的执行结果产生了很大的影响。 值...

    值传递和引用传递

    #### 四、值传递与引用传递的区别 - **数据类型**:值传递通常用于基本数据类型(如int、double等),而引用传递则用于对象类型(如类实例)。 - **内存分配**:值传递时,系统会为形参分配新的内存空间;而引用传递...

    java学习java语言的值传递和引用传递

    java学习java语言的值传递和引用传递

    值传递与引用传递-内存解析

    与值传递不同,引用传递不创建参数值的副本,而是让函数直接访问原始变量。这样,函数对参数的任何操作都会反映到原始变量上。在C++中,引用是一个别名,它指向一个已存在的对象。在Python中,对象是通过引用传递的...

    java参数传递时到底是值传递还是引用传递分享.pdf

    Java中参数传递的方式有两种理解:值传递和引用传递,但这两种说法实际上是对同一种机制的不同角度的描述。下面将详细解释这两种理解方式。 首先,我们来看值传递的理解。在Java中,当一个对象作为参数传递给方法时...

    Java是值传递,传对象引用也是通过值

    总的来说,理解Java中的值传递和对象引用传递对于编写高效、无误的代码至关重要。无论是基本类型还是对象类型,参数传递都是以值的形式进行,但对象类型的值是其引用,允许我们在方法内修改对象的状态,而不影响方法...

    面向对象语言中的值传递与引用传递

    总结来说,值传递和引用传递是Java中处理参数传递的两种机制。理解这两者的差异对于正确处理方法调用和对象状态至关重要。值传递适用于基本数据类型,而引用传递则适用于对象类型,允许方法直接修改对象的状态。在...

    java参数传递时到底是值传递还是引用传递[归类].pdf

    Java的参数传递方式实际上是一种特殊的"值传递",通常被称为"按引用传递对象的引用",这与C++等语言中的引用传递有所不同。以下是对这个主题的详细解释。 在Java中,所有的参数传递都是基于值的,但这涉及到一个...

    Java中的值传递和引用传递

    当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。  值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值  引用传递的特点:方法内部对传...

    详解java的值传递、地址传递、引用传递

    详解java的值传递、地址传递、引用传递 java是一种面向对象的编程语言,它的参数传递机制是值传递的,而不是地址传递或引用传递。很多开发者对java的值传递和地址传递存在误解,认为java中的基本数据类型是值传递,...

    Java 值传递Visio资源

    在Java中,参数传递有两种方式:值传递和引用传递。这个“Java 值传递Visio资源”包含了几个Visio图形文件,帮助我们直观地理解这两种传递方式。 1. **值传递**: 当方法调用时,对于基本类型(如int, double, char...

    一文秒懂java到底是值传递还是引用传递

    Java 值传递还是引用传递详解 Java 程序设计语言中,方法参数传递方式一直是一个备受关注的话题。许多开发者认为 Java 采用的是引用调用,但是实际上,这种理解是不对的。Java 程序设计语言总是采用按值调用,也...

    Java语言中参数值传递和引用传递比较.pdf

    Java 语言中参数值传递和引用传递比较 Java 语言中参数值传递和引用传递是两种不同的参数传递方式,它们在 Java 编程中扮演着重要的角色。参数值传递是指将实际参数的值复制给形式参数,形式参数的变化不影响实际...

Global site tag (gtag.js) - Google Analytics