java通过实例了解值传递和引用传递

首先,需要理解Java中两种数据类型传递方式:值传递和引用传递。值传递是指在方法调用时传递的是实际的值,而引用传递则是指传递的是对象的引用。

值传递(Value Passing)

Java中的基本数据类型,如int、float、boolean等都是通过值传递的方式进行传递。这意味着,当你将一个基本数据类型作为参数传递给一个方法时,它会复制参数的值,并将其传递给方法。在方法内部对参数的任何更改都不会影响到原始参数的值。以下是一个值传递的示例:

public class ValuePassingExample {
    public static void main(String[] args) {
        int x = 5; 
        changeValue(x); 
        System.out.println("x = " + x); 
    }

    public static void changeValue(int a) {
        a = 3; 
    }
}

输出:

x = 5

在上面的代码中,我们定义了一个 x 变量并给它赋值为 5。然后调用 changeValue 方法,并将 x 作为参数传递。在 changeValue 方法内部,我们将 a 的值更改为 3。然而,当我们回到主方法,我们发现 x 的值仍然是 5。这就是因为在方法调用中传递给参数的值被复制到方法内部,而且方法内部对这个值的改变不会影响原来的值。

引用传递(Reference Passing)

与值传递不同,Java 引用传递只传递对象的引用,这意味着在方法中调用参数时,它实际上是调用了对象的引用。这样,当在方法中修改对象时,对原始对象的改变是可见的。示例代码:

public class ReferencePassingExample {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        obj.setVal(10);
        changeReference(obj);
        System.out.println("obj.val = " + obj.getVal());
    }

    public static void changeReference(MyClass a) {
        a = new MyClass();
        a.setVal(20);
    }
}

class MyClass {
    private int val;
    public void setVal(int val) {
        this.val = val;
    }
    public int getVal() {
        return val;
    }
}

输出:

obj.val = 10

在这个例子中,我们定义了一个 MyClass 类,其中包含一个 val 成员变量和相应的 getter 和 setter 方法。在主方法中,我们实例化了一个 MyClass 类型的对象,然后设置了它的值为 10。接下来调用了 changeReference 方法,并将刚才实例化的对象作为参数传递。在 changeReference 方法内部,我们创建了一个新的 MyClass 类型的对象,并将其引用分配给本地变量 a,然后将 val 成员变量的值设置为 20。

changeReference 方法完毕时,控制流回到主方法,我们发现对象的值仍然为 10。与值传递不同,Java 引用传递仅传递对象的引用,因此在方法调用中传递的实际上是对象的引用,而不是对象本身。这就是为什么在 changeReference 方法中对初始对象的任何更改不会影响原来的对象值,而是会影响方法内部的本地变量。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java通过实例了解值传递和引用传递 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Spring 多线程下注入bean问题详解

    Spring 多线程下注入Bean问题详解 当在 Spring 框架中使用多线程进行编程时,很容易遇到线程安全问题。为了解决这些问题,我们可能需要将需要注入的 Bean 类的作用域更改为多例,这样每个线程都有自己独立的实例。然而,这也会引发其他问题,这些问题在本文中将会详细阐述和解决。 问题描述 当在 Spring 中进行多线程编程或使用@Async进行异步…

    Java 2023年5月18日
    00
  • Spring 依赖注入实现示例

    下面我将详细讲解“Spring 依赖注入实现示例”的完整攻略。 简介 在 Spring 中,依赖注入是一种通过引入 bean,或者在文件中定义配置信息,Spring 就能自动地初始化一个类的实例,并注入到另一个类的属性中的方式。Spring 的依赖注入实现基于反射技术,可以极大地简化代码的编写,并且能够有效地降低耦合度。 基本用法 Spring 的依赖注入有…

    Java 2023年5月19日
    00
  • 浅谈MyBatis-plus入门使用

    浅谈MyBatis-plus入门使用 MyBatis-plus(以下简称MP)是一个为MyBatis框架提供增强功能的第三方库,旨在简化MyBatis的开发。本文将深入浅出地探讨MP的入门使用。 安装 将以下依赖添加到Maven或Gradle项目中: <!– MyBatis-plus –> <dependency> <gro…

    Java 2023年5月19日
    00
  • Java提效神器Stream的一些冷门技巧汇总

    Java提效神器Stream的一些冷门技巧汇总 什么是Java Stream Java Stream是Java 8引入的一个新的集合处理方式,它可以用来处理很大的数据流,并行处理数据以及实现简洁的函数式编程。 Stream的主要优点是可以大大简化代码,同时可以在处理大数据集时提高性能。Stream是延迟执行的,也就是说它不会立即处理所有的数据,而是在需要的时…

    Java 2023年5月26日
    00
  • Java二维数组与稀疏数组相互转换实现详解

    Java二维数组与稀疏数组相互转换实现详解 二维数组与稀疏数组在Java中是常见的数据结构,二维数组用来表示二维网格数据,稀疏数组用来表示大部分元素都是相同值的数组。本篇攻略将详细讲解Java中如何实现二维数组与稀疏数组的相互转换。 1. 二维数组转稀疏数组 实现过程:1. 遍历二维数组,统计非零元素的个数count。2. 创建一个稀疏数组sparseArr…

    Java 2023年5月26日
    00
  • Java swing读取txt文件实现学生考试系统

    准备工作 首先,我们要在Java环境中搭建好Java swing的开发环境,并确定好要读取的txt文件的路径和文件名。 读取txt文件 我们可以使用Java语言中的文件输入流(FileInputStream)、字符输入流(InputStreamReader)和缓存输入流(BufferedReader)来读取txt文件,并将其存储到字符串中。代码示例如下: i…

    Java 2023年5月30日
    00
  • 如何实现Java线程安全问题

    Java线程安全是一个非常重要的问题,它涉及到在多线程情况下对共享资源的访问和操作。如果不注意线程安全问题,可能会导致数据混乱、竞态条件等问题。下面是一些实现Java线程安全的攻略: 1.使用同步方法和同步块 同步方法和同步块都可以用来实现线程安全。它们的核心思想是在多个线程访问共享资源时,只有一个线程能够访问这个资源,其他线程需要等待。具体实现方式如下: …

    Java 2023年5月26日
    00
  • Java 超基础讲解String的使用

    我将为您提供 Java 超基础讲解 String 的使用的完整攻略,具体如下: 一、什么是 String 在 Java 中,String 是一个类,它代表了一个字符串。 二、创建一个字符串变量 可以通过两种方式来创建一个字符串变量: 1. 直接赋值 String str1 = "Hello World"; 2. 使用构造方法 String…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部