精华内容
下载资源
问答
  • 值传递是指将实际参数的值复制一个传给形参,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。 引用传递: 也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的...

    java中只有值传递,没有引用传递

    值传递:

    值传递是指将实际参数的值复制一个传给形参,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。

    引用传递:

    也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址,在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。

    在java中传递地址值时是将地址值 复制 一份传给形参,此时两份地址值都指向同一块内存地址,修改时修改的是对象本身的属性,而不是地址值本身,所以是值传递

    展开全文
  • 值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递:引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数...

    结论:java是值传递。

    1.值传递?引用传递?

    先来看看百度百科的定义:

    值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

    引用传递:引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

    java有两种数据类型,一种是基本类型,例如int;另一种是引用数据类型,如String。

    基本数据类型存储的都是实际的值,而引用类型的变量存储的是对象的引用(即对象在内存中的地址)。值和引用存储在stack(栈)中,对象存储在heap(堆)中。下图n1代表一个基本数据类型,n2代表一个引用数据类型。

    在这里插入图片描述

    l两种类型区别的原因

    • 栈的优势是,存取速度比堆要快,仅次于直接位于 CPU 中的寄存器。但缺点是,栈中的数据大小与生存周期必须是确定的。
    • 堆的优势是可以动态地分配内存大小,生存周期也不必事先告诉编译器,Java 的垃圾回收器会自动收走那些不再使用的数据。但由于要在运行时动态分配内存,存取速度较慢。

    2.基本数据类型的参数传递

    基本数据类型的值直接存储在栈中,当作为参数传递时,会将原始值(实参)复制一份新的出来,给形参用。形参将会在被调用方法结束时从栈中清除。

    在如下的代码中

    public class PrimitiveTypeDemo {
        public static void main(String[] args) {
            int age = 18;
            modify(age);
            System.out.println(age);		//输出结果为18
        }
    
        private static void modify(int age1) {
            age1 = 30;
        }
    }
    
    1. main中的age为基本类型,它的值会直接存储在栈中。
    2. 调用 modify() 方法的时候,将为实参 age 创建一个副本(也就是形参 age1),它的值也为 18,不过是在栈中的其他位置。
    3. 对形参 age1 的任何修改都只会影响它自身而不会影响实参age。

    在这里插入图片描述

    3. 引用类型的参数传递

    在分析引用类型时,首先要分清楚Write demo = new Write();中的demo是对象还是对象的引用。上述语句可以写成两行代码:

    Write write;
    write = new Write();
    

    如果write是对象,那么就不需要new关键字创建对象了,所以在“=”操作符之前,write只是一个变量。new Write()是一个对象,它存在于堆中。”=“将对象的引用赋给了write,此时write应该叫对象引用,它存储于栈中,保存了对象在堆中的地址。

    每当引用类型作为参数传递时,都会创建一个对象引用(实参)的副本(形参),该形参保存的地址和实参一样。

    如下代码:

    public class ReferenceTypeDemo {
        public static void main(String[] args) {
            Writer a = new Writer(18);
            Writer b = new Writer(18);
            modify(a, b);
    
            System.out.println(a.getAge());		//输出30
            System.out.println(b.getAge());		//输出18
        }
    
        private static void modify(Writer a1, Writer b1) {
            a1.setAge(30);
    
            b1 = new Writer(18);
            b1.setAge(30);
        }
    }
    
    1. 在调用modify()方法之前,实参a、b所指向对象是不同的。

    2. 在调用 modify() 方法时,实参 a 和 b 都在栈中创建了一个新的副本 a1 和 b1,但指向的对象是一致的(a 和 a1指向对象 a,b 和 b1指向对象 b)。

    在这里插入图片描述

    1. modify() 方法中,修改了形参 a1 的 age 为 30,意味着对象 a 的 age 从 18 变成了 30,而实参 a 指向的也是对象 a,所以 a 的 age 也变成了 30;形参 b1 指向了一个新的对象,随后 b1 的 age 被修改为 30。

    在这里插入图片描述

    修改 a1 的 age,意味着同时修改了 a 的 age,因为它们指向的对象是一个;修改 b1 的 age,对 b 却没有影响,因为它们指向的对象是两个。

    所以综上可以判断,java是值传递。

    展开全文
  • 值传递与引用传递

    2019-04-19 17:05:12
    值传递是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。(因为值传递的时候,实际上是将实参的值复制一份给形参。) 引用传递是指对象被引用传递,意味着传递的并不是实际的对象...

    值传递与引用传递

    首先明确对象类型(数组,类,接口)是引用传递,基本数据类型是值传递。

    值传递是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。(因为值传递的时候,实际上是将实参的值复制一份给形参。)

    引用传递是指对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象的改变会反映到所有的对象上。(因为引用传递的时候,实际上是将实参的地址值复制一份给形参。)

    Tips:有的方法中传递的是引用,但结果值没有被改变是因为在方法中没有直接操作对象的值,而是建了一个新的同类型对象,并试图使传递的引用指向新的对象,这是不被允许的。

    展开全文
  • 引用传递和值传递

    2019-09-06 17:56:32
    值传递是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。(因为值传递的时候,实际上是将实参的值复制一份给形参。) 引用传递是指对象被引用传递,意味着传递的并不是实际的对象...

     

    对象传递(数组、类、接口)是引用传递,原始类型数据(整型、浮点型、字符型、布尔型)传递是值传递。

    那么什么是值传递和应用传递呢?

    值传递是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。(因为值传递的时候,实际上是将实参的值复制一份给形参。)

    引用传递是指对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象的改变会反映到所有的对象上。(因为引用传递的时候,实际上是将实参的地址值复制一份给形参。)

     

    值传递和应用传递实例

    1. 值传递

    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
    
        swap(num1, num2);
    
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }
    
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }

    结果:

    a = 20
    b = 10
    num1 = 10
    num2 = 20
    

    解析:在swap方法中,a、b的值进行交换,并不会影响到num1、num2。因为,a、b中的值,只是从num1、num2的复制过来的。 也就是说,a、b相当于num1、num2的副本,副本的内容无论怎么修改,都不会影响到原件本身。

    2. 引用传递

    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
    
        change(arr);
    
        System.out.println(arr[0]);
    }
    
    public static void change(int[] array) {
    //将数组的第一个元素变为0
        array[0] = 0;
    }

    结果:

    0
    

    解析:无论是主函数,还是change方法,操作的都是同一个地址值对应的数组。 。因此,外部对引用对象的改变会反映到所有的对象上。

     

    一些特殊的例子

    1. StringBuffer类型传递

    	// 测试引用传递:StringBuffer
    	@org.junit.Test
    	public void method1() {
    		StringBuffer str = new StringBuffer("AAAAAAAAAAAAAAAAAAAAAAAAA");
    		System.out.println(str);
    		change1(str);
    		System.out.println(str);
    	}
    
    	public static void change1(StringBuffer str) {
    		str = new StringBuffer("BBBBBBBBBBBBBBBBBBBBBBBB");
    	}

    结果:

    AAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAA

    解析:

    很多要这个时候要问了:StringBuffer创建的明明也是对象,那为什么输出结果依然是原来的值呢?

    因为在change1方法内部我们是新建了一个StringBuffer对象,所以str指向了另外一个地址,相应的操作也同样是指向另外的地址的。

     public static void change1(StringBuffer str) {

    		str.append("CCCCCCCCCCCCCCCCC");
    		str.insert(3, "(DDDDDDDDDDDD)");	
    	}
    

    2. String类型传递

    	public void method2() {
    		String str = new String("DDDDDDDDDDDDDDDDDDDDDDDDDDDD");
    		System.out.println(str);
    		change2(str);
    		System.out.println(str);
    	}
    
    	public static void change2(String str) {
    		// str="EEEEEEEEEEEEEEEEEEEEEEEEEEEE";
    		str = new String("EEEEEEEEEEEEEEEEEEEEEEEEEEEE");
    
         } 

    结果:

    DDDDDDDDDDDDDDDDDDDDDDDDDDDD
    DDDDDDDDDDDDDDDDDDDDDDDDDDDD

    可以看到不论是执行str="abc;"还是str = new String("abc");str的输出的值都不变。 按照我们上面讲“StringBuffer类型传递”的时候说的,str="abc;"应该会让str的输出的值都不变。为什么呢?因为String在创建之后是不可变的。

    3. 一道类似的题目

    下面的程序输出是什么?

    public class Demo {
    	public static void main(String[] args) {
    		Person p = new Person("张三");
    
    		change(p);
    
    		System.out.println(p.name);
    	}
    
    	public static void change(Person p) {
    		Person person = new Person("李四");
    		p = person;
    	}
    }
    
    class Person {
    	String name;
    
    	public Person(String name) {
    		this.name = name;
    	}
    }

    很明显仍然会输出张三。因为change方法中重新创建了一个Person对象。

    那么,如果把change方法改为下图所示,输出结果又是什么呢?

    	public static void change(Person p) {
    		p.name="李四";
    	}

    输出结果为 李四

    展开全文
  • 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数 #include<stdio.h> void fun(int num) { num=0; //修改参数 } int main() { int a=...
  • 值传递在方法调用时,传递的参数按值的拷贝传递。特点:传递的值的拷贝,也就是传递后就互不相关了。引用传递:在方法调用时,传递的参数按引用进行传递,其实传递的引用的地址,也就是变量...
  • Java值传递

    2020-09-04 11:12:13
    值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递 引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的...
  • 值传递和引用传递

    2020-06-03 07:46:18
    值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。简单来说就是直接复制了一份数据过去,因为是直接复制,所以这种方式在传递时如果数据量非常大的话...
  • 前言 最近和同事讨论算法效率问题无意中涉及到一个问题,java中调用方法的时候是值传递呢?还是引用传递?...值传递是指将该值复制一份出来使用,比如a复制一份a1出来,a1做的操作不会影响到a。例子如下:
  • : 值传递是指传递参数的一个拷贝过去,这个拷贝被修改,原来的参数是不会发生变化的,而引用传递是将引用传递过去,如果参数被修改,参数就真的发生了变化。 java中的基本数据类型i被传递到另外一个方法中并进行修改...
  • Java中为什么是值传递

    2020-08-11 08:39:35
    值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。简单来说就是直接复制了一份数据过去。 值传递主要是对基本型变量而言的,传递的是该变量的一个副本...
  • 值传递值传递是指在调用函数时将实际参数复制一份传递给形参,这样在函数中对形参的修改将不会影响到实际参数的值。引用传递引用传递是指在调用函数时将实际参数的地址直接传递到形参,那么在函数中对参数所进行的...
  • Java 完全的值传递

    2015-04-16 09:43:20
    什么是值传递值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。Java的值传递基本类型的值传递在Java中基本类型(int 等)的变量值都是直接放在栈里面的...
  • Javascript值传递与引用传递什么是值传递、参数传递值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数; 引用传递是指在调用函数时将实际参数的地址...
  • 在通常的说法中,方法参数的传递分为两种,值传递和引用传递,值传递是指将实际参数复制一份传递到方法中,在方法中的改动将不会影响到实际参数本身,而引用传递则是指传递的是实际参数本身,在方法中的改动将会影响...
  • 可能有很多小伙伴都知道...这里涉及到值传递和引用传递两种传递机制:值传递(pass by value):是指在调用方法(或者函数)时,将实际参数复制一份传递到方法(或者函数)中,这样在函数中如果对形式参数进行修改,将不...
  • 值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递:引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数...
  • 值传递是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。(因为值传递的时候,实际上是将实参的值复制一份给形参。) 引用传递是指对象被引用传递,意味着传递的并不是实际的对象...
  • 值传递是指在调用函数时将实际参数复制一份传递到函数中 并且在函数中对参数进行修改不会影响到实际参数 例如 public class Test { public static void test(int y) { y=0; } public static void main...
  • 1、按值传zhi递dao:值传递是指在调用函数时将实际参zhuan数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。简单来说就是直接复制了一份数据过去,因为是直接复制,所以这种方式在...
  • 1:按值传递是什么的是在方法调用时,传递的参数是按值的拷贝传递。示例如下:public class TempTest {private void test1(int a){//做点事情}public static void main(String[] args) {TempTest t = new TempTest...
  • Java值传递证明

    2020-09-15 14:16:16
    从我实习面试开始就有在面试中遇到过这个问题:Java是值传递还是引用传递? 当时的我只会背背面试题...值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到.
  • 引用与值传递

    2018-02-20 17:19:01
    值传递是指将要传递的值当做一个副本传递。值传递过程中,被调函数的形参作为被调函数的局部变量处理,在内存的堆栈中开辟空间以存放由主调函数存放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调...
  • 值传递是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。(因为值传递的时候,实际上是将实参的值复制一份给形参。)引用传递是指对象被引用传递,意味着传递的并不是实际的对象,...
  • 1.值传递是指一个参数传递给一个函数时,函数接收的是原始值得副本。 2.引用传递是一个参数传递给一个函数时,函数接收的是原始值的地址。 3.java应用程序中,有且仅有一种传递,即值传递。 4.对象是按引用传递的...
  • 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 也就是说在我们调用的方法中,我们用的其实不是一个参数,而是一个新的参数,与实参只是数值...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,370
精华内容 948
关键字:

值传递是指