java中的数据传递方式


java的传值方式

目录


结论

首先说结论:java基本是值传递

分析

关于这个问题,其实一直以来都很有争论的,我也是为此查询了很多资料,在此发表一下自己的拙见。

我们从内存出发,两者的区别其实就是操作一块内存和新开辟一块内存的区别,知道了这个我们来看看“值传递”与“引用传递”这两个专有名词的意义

  • 值传递: 会在传值过程中,将自身拷贝(复制)一份,赋给给新建的(临时)变量
  • 引用传递:在传值过程中,本身其实并不会传递,传递的是实际参数的隐式引用

接下来我们分别试一下基本数据类型和引用数据类型(以下直接用对象称呼)以及String

基本数据类型

    public static void updata(int value){
        value = 100;
        System.out.println("形参" +value);
    }
    public static void main(String[] args) {
        int a = 50;
        System.out.println("a" +a);
        updata(a);
        System.out.println("a在执行函数updata后:"+a);
    }

执行结果

a50
形参100
a在执行函数updata后:50

基本数据类型为值传递,因此在方法内部修改的只是形参,在方法执行结束后,形参也被销毁,a并无任何改变

看看自己定义的对象

public class User {
    int id;
    String name;
    int age;

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '/'' +
                ", age=" + age +
                '}';
    }
 }

    public static void updataUser(User user){
        user.setId(2);
        user.setName("asd");
        user.setAge(25);
        System.out.println(user);
        System.out.println(System.identityHashCode(user));
    }
    public static void main(String[] args) {
        User user = new User(1,"qwe",24);
        //没有重写toString,会打印地址
        System.out.println(user);
        System.out.println(System.identityHashCode(user));
        updataUser(user);
        System.out.println(user);
        System.out.println(System.identityHashCode(user));

    }

    

结果如下:

User{id=1, name=’qwe’, age=24}
460141958
User{id=1, name=’qwe’, age=24}
User{id=2, name=’asd’, age=25}
460141958
User{id=2, name=’asd’, age=25}
460141958

可以看出实参与形参的地址是一模一样的,数据修改是直接在源数据进行修改的

public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str = "data1";
        String str2 = new String("data2");
        StringBuffer buffer = new StringBuffer("data3");
        System.out.println("!!!!!1 str:=" + str + " str2:=" + str2
                + " buffer:=" + buffer.toString());
        dealData(str, str2, buffer);
        System.out.println("!!!!!2 str:=" + str + " str2:=" + str2 + " buffer:=" + buffer.toString());
    }
    private static void dealData(String str, String str2, StringBuffer buffer) {
        str += "123";
        str2 += "123";
        buffer.append("123");
        System.out.println("nerborn: str:=" + str + " str2:=" + str2 + " buffer:=" + buffer.toString());
    }

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/281567.html

(0)
上一篇 2022年8月22日
下一篇 2022年8月22日

相关推荐

发表回复

登录后才能评论