当前位置:首页>开发>正文

Java是传值还是传引用 Java的参数传递是「按值传递」还是「按引用传递」

2023-07-07 11:44:38 互联网 未知 开发

 Java是传值还是传引用 Java的参数传递是「按值传递」还是「按引用传递」

Java是传值还是传引用

这一点我们可以通过一个简单的例子来说明:/* 例 1 */ /** * @(#) Test.java * @author fancy */ public class Test { public static void test(boolean test) { test = ! test System.out.PRintln("In test(boolean) : test = " test) } public static void main(String[] args) { boolean test = true System.out.println("Before test(boolean) : test = " test) test(test) System.out.println("After test(boolean) : test = " test) } } 运行结果:Before test(boolean) : test = true
In test(boolean) : test = false
After test(boolean) : test = true 不难看出,虽然在 test(boolean) 方法中改变了传进来的参数的值,但对这个参数源变量本身并没有影响,即对 main(String[]) 方法里的 test 变量没有影响。那说明,参数类型是简单类型的时候,是按值传递的。以参数形式传递简单类型的变量时,实际上是将参数的值作了一个拷贝传进方法函数的,那么在方法函数里再怎么改变其值,其结果都是只改变了拷贝的值,而不是源值。 2. 什么是引用 Java 是传值还是传引用,问题主要出在对象的传递上,因为 Java 中简单类型没有引用。既然争论中提到了引用这个东西,为了搞清楚这个问题,我们必须要知道引用是什么。 简单的说,引用其实就像是一个对象的名字或者别名 (alias),一个对象在内存中会请求一块空间来保存数据,根据对象的大小,它可能需要占用的空间大小也不等。访问对象的时候,我们不会直接是访问对象在内存中的数据,而是通过引用去访问。引用也是一种数据类型,我们可以把它想象为类似 C 语言中指针的东西,它指示了对象在内存中的地址——只不过我们不能够观察到这个地址究竟是什么。 假如我们定义了不止一个引用指向同一个对象,那么这些引用是不相同的,因为引用也是一种数据类型,需要一定的内存空间来保存。但是它们的值是相同的,都指示同一个对象在内存的中位置。比如String a = "Hello"
String b = a 这里,a 和 b 是不同的两个引用,我们使用了两个定义语句来定义它们。但它们的值是一样的,都指向同一个对象 "Hello"。也许你还觉得不够直观,因为 String 对象的值本身是不可更改的 (像 b = "World" b = a 这种情况不是改变了 "World" 这一对象的值,而是改变了它的引用 b 的值使之指向了另一个 String 对象 a)。那么我们用 StringBuffer 来举一个例子:/* 例 2 */ /** * @(#) Test.java * @author fancy */ public class Test { public static void main(String[] args) { StringBuffer a = new StringBuffer("Hello") StringBuffer b = a b.append(", World") System.out.println("a is " a) } } 运行结果:a is Hello, World 这个例子中 a 和 b 都是引用,当改变了 b 指示的对象的值的时候,从输出结果来看,a 所指示的对象的值也改变了。所以,a 和 b 都指向同一个对象即包含 "Hello" 的一个 StringBuffer 对象。 这里我描述了两个要点: 引用是一种数据类型,保存了对象在内存中的地址,这种类型即不是我们平时所说的简单数据类型也不是类实例(对象); 不同的引用可能指向同一个对象,换句话说,一个对象可以有多个引用,即该类类型的变量。 3. 对象是如何传递的呢 关于对象的传递,有两种说法,即“它是按值传递的”和“它是按引用传递的”。这两种说法各有各的道理,但是它们都没有从本质上去分析,即致于产生了争论。 既然现在我们已经知道了引用是什么东西,那么现在不妨来分析一下对象作是参数是如何传递的。

Java的参数传递是「按值传递」还是「按引用传递」

java中在进行方法参数传递时,无论传递的是原生数据类型还是引用类型, 统一为传值(pass by value),java中没有传引用 (pass by reference)的概念,, 有些书上说传引用,是错误的说法。

Java的参数传递是「值传递」还是「引用传递」

java的数据类型分为基本类型和引用类型
基本类型:byte,short,int,long,char,float,double,boolean
引用类型:类,接口和数组。
基本类型的参数是值传递,引用类型的参数是引用传递
另外String、Integer、Double、Long……等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象
JAVA中值传递和引用传递

java中的值传递和引用传递的区别

值传递和引用传递是c中的概念,在java中可以用于方便理解,但是java中是值传递的。说说区别吧,昨天刚好看见这个问题。8个基本数据类型是值传递,即方法内对其修改是不会改变实参的,其他引用类型(除了string)可以理解为引用传递,传进方法内部的是一个地址,可以理解为房子的钥匙,你有了钥匙,照样可以对房子进行改变,是吧。那为什么string不行呢?因为string是不可改变的,虽然它也是传了地址,但已经是第二个引用(b)了 ,当你对形参进行改变,这时候b会指向新的string对象。这时候原来的引用a是没有改变的,还是指向第一个对象。
不懂可以追问,共同学习

java中究竟是传值还是传引用

1、JAVA中主要是引用传递来替代的C 指针
2、引用传递:一个堆内存同时被多个栈内存所指向
3、范例:引用传递
public class Person() {
    private String name 
    public void setName(String name) {
        this.name = name 
    }
    public String getName() {
        return this.name 
    }
}

public class TestDemo {
    public static void main(String args[]) {
        Person per1 = new Person() 
        Person per2 = per1  //引用传递
        per1.setName("大马猴") 
        System.out.println(per2.getName())  
    }
}

最新文章