首页 > 编程语言 >java中为什么只存在值传递(以传入自定义引用类型为例)

java中为什么只存在值传递(以传入自定义引用类型为例)

时间:2022-08-14 11:58:31浏览次数:67  
标签:sname java 自定义 为例 s1 sage System Student println

java中只有值传递

为什么这么说?两个例子:

public class Student {
    int sage = 20;
    String sname = "云胡不归";

    public static void change(Student s1) {
        s1.sname = "荀一";
        s1.sage = 30;
        System.out.println("-----------------------------------------------------------------");
        System.out.println("change方法内 s1存储的堆空间地址 = " + s1);
        System.out.println("修改时 s1.sname = " + s1.sname + " and s1.sage = " + s1.sage);
        System.out.println("-----------------------------------------------------------------");
    }

    public static void main(String[] args) {
        Student s = new Student();//此处的s是引用类型 实在栈空间开辟的一块空间,存储一个堆空内的地址 假设s指向堆空间的第一个Student对象
        System.out.println("main方法内 s存储的堆空间地址 = " + s);
        System.out.println("创建时 s.sname = " + s.sname + " and s.sage = " + s.sage);
        change(s);//值传递的含义在于 将 s存储的地址复制一份 传入函数,使得函数内的形参s1存储地址和s相同 此时s1和s同时指向第一个Student对象
        System.out.println("修改后 s.sname = " + s.sname + " and s.sage = " + s.sage);
    }
}
//打印结果:
main方法内 s存储的堆空间地址 = com.iweb.test.Student@1b6d3586
创建时 s.sname = 云胡不归 and s.sage = 20
-----------------------------------------------------------------
change方法内 s1存储的堆空间地址 = com.iweb.test.Student@1b6d3586
修改时 s1.sname = 荀一 and s1.sage = 30
-----------------------------------------------------------------
修改后 s.sname = 荀一 and s.sage = 30

//上述打印结果的含义:在栈空间有两块空间存储着一模一样的堆内存地址 无论修改哪一个都会影响它们指向的Student对象的属性
//当然现在无法证明 栈空间是不是的确有两块空间存储着一模一样的堆内存地址 抑或是 只有一块栈内存,s1和s一起在用,因此引入下一个例子

在change方法中再加上一句s1 = new Student();

public class Student {
    int sage = 20;
    String sname = "云胡不归";

    public static void change(Student s1) {
        s1 = new Student();//使得栈空间s1存储一个新的堆内存地址 指向一个新的Student对象
        s1.sname = "荀一";
        s1.sage = 30;
        System.out.println("-----------------------------------------------------------------");
        System.out.println("change方法内 s1存储的堆空间地址 = " + s1);
        System.out.println("修改时 s1.sname = " + s1.sname + " and s1.sage = " + s1.sage);
        System.out.println("-----------------------------------------------------------------");
    }

    public static void main(String[] args) {
        Student s = new Student();//此处的s是引用类型 实在栈空间开辟的一块空间,存储一个堆空内的地址 假设s指向堆空间的第一个Student对象
        System.out.println("main方法内 s存储的堆空间地址 = " + s);
        System.out.println("创建时 s.sname = " + s.sname + " and s.sage = " + s.sage);
        change(s);//值传递的含义在于 将 s存储的地址复制一份 传入函数,使得函数内的形参s1存储地址和s相同 此时s1和s同时指向第一个Student对象
        System.out.println("修改后 s.sname = " + s.sname + " and s.sage = " + s.sage);
    }
}
//打印结果:
main方法内 s存储的堆空间地址 = com.iweb.test.Student@1b6d3586
创建时 s.sname = 云胡不归 and s.sage = 20
-----------------------------------------------------------------
change方法内 s1存储的堆空间地址 = com.iweb.test.Student@4554617c
修改时 s1.sname = 荀一 and s1.sage = 30
-----------------------------------------------------------------
修改后 s.sname = 云胡不归 and s.sage = 20
//修改了栈空间内s1中存储的地址后对s没有任何影响 由此可见 s1和s在栈空间内占据两块独立的空间

以上两个例子可以得出 引用类型传入change()方法的方式是值传递,是将地址复制了一份作为change()的参数

如果是引用传递 则 s1 和 s 应该是同一片栈空间 s1 = new Student()后,相当于也进行了 s = new Student() 的操作 change(s)调用后,对象的属性依旧会被修改

标签:sname,java,自定义,为例,s1,sage,System,Student,println
From: https://www.cnblogs.com/tianxiayifan/p/16585135.html

相关文章

  • Java数组
    Java数组数组的定义:数组是相同类型数据的有序集合。数组描述的是相同类型的若干数据,按照一定的先后次序排列组合而成。其中,每一个数据称为一个数组元素,每个数组元素......
  • java第七周学习情况
    这个星期主要是在搞学校在暑期安排的实验报告b怎么说来着才知道这个消息几天 这是对学习不上心的体现啊题目也有点多慢慢做呗而Java这边还是看些相关知识呗说实话......
  • 数据结构与算法【Java】04---递归
    前言数据data结构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码。要学习好数据结构就......
  • 红黑树以及JAVA实现(一)
    目录前言一、B树1.1概念1.22-3-4树1.32-3-4树的插入节点分类1.42-3-4树的删除1.4.1当删除节点是叶子节点1.4.1.1当删除节点为非2节点1.4.1.2当删除节点为2节点1.4.......
  • 红黑树以及JAVA实现(二)
    目录红黑树的删除1.删除节点为叶子节点1.1删除节点为红色节点1.2删除节点为黑色1.2.1要删除的节点D是黑色,D的兄弟节点B也是黑色没有侄子节点1.2.2要删除的节点D是黑色......
  • java学习记录
    # 第一个SpringBoot项目https://www.jb51.net/article/223251.htm#_label0#pom用阿里云源```<repositories><repository><id>public</id><name>......
  • JavaScript 对 DOM 元素排序
    <!DOCTYPEhtml><html><head><styletype="text/css">#wrapdiv{float:left;}#wrap:after{......
  • Java 中使用 public,private 和 protected 修饰的方法
    大部分情况下我们都使用这几个修饰来修饰方法。当然对类来说,相信大部分都默认使用Public,大部分人都不去纠结。Public:简单来说就是谁都可以访问,你写个类除了特殊要求,当......
  • JavaWeb阶段性项目1:系统的servlet优化5
    前置知识前置准备知识准备已掌握JavaSE/MySQL/JDBC+HTML/CSS/JavaScript基础并已完成了Javaweb前置知识的学习01-JavaWeb-HTML初识02-JavaWeb-CSS初识03-JavaWeb-Ja......
  • JavaWeb阶段性项目1:Servlet-api、mvc-service引入、IOC和DI
    Servlet-apiservlet类的继承与实现结构Servlet生命周期:实例化、初始化、服务、销毁init()方法抽象类GenericServlet实现了Servlet接口中的init方法,初始化Servlet......