IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JAVA是值传递还是引用传递? -> 正文阅读

[Java知识库]JAVA是值传递还是引用传递?

前言

今天有人问我Java中参数得传递是值传递,还是引用传递,还是两种都有?

我的回答是:Java中只有值传递。
当他问我为什么得时候,我说不出个所以然。最后通过查阅别人得一些间接,写下了这篇博客,如果有任何错误之处,希望大家给与指教。

为什么Java只有值传递?

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

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

JAVA中得类型分为 8 个基本类型 和 其他的引用类型。

我们首先看下面几种情况:

  1. 基本数据类型作为参数
public class Test {
    public static void main(String[] args) {
        int arg = 1;
        System.out.println("main:before " + arg);
        change(arg);
        System.out.println("main:after " + arg);
    }

    public static void change(int arg){
        arg = 5;
        System.out.println("change: " + arg);

    }
}

结果截图:
在这里插入图片描述
方法中的改变,并没有改变main中的值,所以肯定是值传递。

  1. 引用传递

第一种情况:

public class Test {
    public static void main(String[] args) {
       String name = "jack";
        System.out.println("main:before " + name);
        change(name);
        System.out.println("main:after " + name);
    }

    public static void change(String name){
        name = "tom";
        System.out.println("change: " + name);

    }
}

结果截图:
在这里插入图片描述
当传递的是String对象,在方法中进行修改不会更改main中的值。那么看下面这种情况。

第二种情况:

public class Test {
    public static void main(String[] args) {
       String name = "jack";
       int age = 1;
       Student stu = new Student(name,age);
        System.out.println(stu);

        change(stu);

        System.out.println(stu);
    }

    public static void change(Student stu){
        stu.setName("tom");
        stu.setAge(5);

    }

   static class  Student{
        private String name;
        private int  age;
        public  Student(){

        }

        public  Student(String name , int age){
            this.name = name;
            this.age = age;
        }

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

       public void setAge(int age) {
           this.age = age;
       }

       public int getAge() {
           return age;
       }

       @Override
       public String toString() {
           return "Student{" +
                   "name='" + name + '\'' +
                   ", age=" + age +
                   '}';
       }
   }
}

结果截图:

在这里插入图片描述
从结果来看,好像stu的值好像改变了,是不是就意味着Java中存在引用传递?

其实并不是,这种情况依然是值传递!!!

我们知道 Student stu = new Student(name,age);这段代码,首先会在堆区new 一个对象,然后stu 引用这个对象。

当我们调用change()方法的时候,其实是将引用拷贝了一份,(两个对象指向同一个引用)对于stu来说,它自己的地址才代表的实参,change()是对参数的修改,并没有影响stu的地址,而是修改了对象属性(因为修改了同一个引用,所以才会看到stu发生了改改变,但是实际上stu自身的地址并没有任何改变)。而我们混淆的原因在于,我们看见对象本身被修改了。

还是理解不了没关系,看下面的代码,我们修改change()种的代码

 public static void change(Student stu){
        stu = new Student("tom",5);

    }

结果:
在这里插入图片描述

为什么?就像上面所说,传进去的参数其实不是实参,而是一个拷贝,不过是指向同一个引用,当在change()方法中,又指向另一个引用时,并不会影响stu。

“引用传递”中的“引用”二字,绝对不能简单的理解为“引用类型”中的“引用”,而应该理解为“指针”、“地址”,Java中就算是基本类型也同样拥有“地址”和“指针”。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 21:59:56  更:2022-03-11 22:02:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:22:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码