java多线程    Java入门    vsftp    ftp    linux配置    centos    FRP教程    HBase    Html5缓存    webp    zabbix    分布式    neo4j图数据库    

Java是值传递还是引用传递

当一个对象被当作参数传递给一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,到底是值传递,还是引用传递?

答案:是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个

参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调

用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和 C#中可以

通过传引用或传输出参数来改变传入的参数的值。

理解下

值传递(pass by value)是指在调用方法时将实参复制一份传递到方法中,这样当方法对形参进行修改时不会影响到实参。

引用传递(pass by reference)是指在调用方法时将实参的地址直接传递到方法中,那么在方法中对形参所进行的修改,将影响到实参。

形参:定义方法名和方法体的时候使用的参数,目的是用来接收调用该方法时传入的参数。

实参:调用有参方法时传入的参数,方法名后面的括号中的参数通常被称为“实参”。

核心区别一个是定义,一个是调用时期的

public class Cmower {
    public static void main(String[] args) { //args 形参
        System.out.println("hello world");// "hello world" 实参
    }
}

基本类型值传递

public class Cmower {
    public static void main(String[] args) {
        Cmower cmower = new Cmower();
        int age = 18;
        cmower.sop(age);
        System.out.println("main 中的 age " + age);
    }

    public void sop(int age) {
        age = 28;
        System.out.println("sop 中的 age " + age);
    }
}
//out============
sop 中的 age 28
main 中的 age 18

引用类型的值传递

public class Cmower {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        Cmower cmower = new Cmower();
        cmower.setName("沉默王二");
        cmower.sop(cmower);
        System.out.println("main 中的 cmower " + cmower.getName());
    }

    public void sop(Cmower cmower) {
        cmower.setName("沉默王三");
        System.out.println("sop 中的 cmower " + cmower.getName());
    }
}
//out ————————————————
sop 中的 cmower 沉默王三
main 中的 cmower 沉默王三
Java 的确是值传递的。只不过,引用类型在调用有参方法的时候,传递的是对象的引用,并不是对象本身。而对象的引用在传递的过程中并没有发生改变,虽然对象本身发生了变化。

再看

Cmower cmower = new Cmower();
cmower.setName("沉默王二");

Cmower old = cmower;
cmower.sop(cmower); //打印沉默王三
System.out.println("main 中的 cmower " + cmower.getName()); //打印沉默王三

System.out.println(old == cmower);
//out ————————————————
sop 中的 cmower 沉默王三
main 中的 cmower 沉默王三
true

内存模型图

image-20230314144549655

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());
        System.out.println(b.getAge());
    }

    private static void modify(Writer a1, Writer b1) {
        a1.setAge(30);

        b1 = new Writer(18);
        b1.setAge(30);
    }
}
————————————————
30
18
a1就是在调用一个对象引用 而b1 是两个,执行modify的时候b1和b没有关系了,因为里面b1 new了个新对象
而内存里a1和a是一个对象的引用。

Writer writer;
writer = new Writer(18);
new Writer(18),它是对象,存储于堆中  writer 此时应该叫对象引用,它存储在栈中,保存了对象在堆中的地址

https://blog.csdn.net/qing_gee/article/details/103486068

https://www.cnblogs.com/programb/p/13021304.html

https://blog.csdn.net/qing_gee/article/details/105650149


This entry was posted in JAVA and tagged , . Bookmark the permalink.
月小升QQ 2651044202, 技术交流QQ群 178491360
首发地址:月小升博客https://java-er.com/blog/java-value-pass-reference-transmit/
无特殊说明,文章均为月小升原创,欢迎转载,转载请注明本文地址,谢谢
您的评论是我写作的动力.

Leave a Reply