首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Java中的某些方法会修改原始值而有些则不会?

这个问题涉及到Java中的值传递和引用传递的概念。在Java中,方法参数的传递方式是值传递。但是,当传递对象时,实际上传递的是对象的引用,而不是对象本身。这意味着,当我们在方法中修改对象的属性时,原始值会被修改,而当我们尝试修改对象本身时,原始值不会被修改。

以下是一些示例:

  1. 基本数据类型:
代码语言:java
复制
public static void main(String[] args) {
    int a = 10;
    System.out.println("Before: " + a);
    modify(a);
    System.out.println("After: " + a);
}

public static void modify(int a) {
    a = 20;
}

输出:

代码语言:txt
复制
Before: 10
After: 10

在这个例子中,我们尝试在modify方法中修改a的值,但是原始值没有被修改。这是因为基本数据类型是值传递的,所以在方法中的任何修改都不会影响原始值。

  1. 对象:
代码语言:java
复制
public static void main(String[] args) {
    MyClass a = new MyClass(10);
    System.out.println("Before: " + a.getValue());
    modify(a);
    System.out.println("After: " + a.getValue());
}

public static void modify(MyClass a) {
    a.setValue(20);
}

输出:

代码语言:txt
复制
Before: 10
After: 20

在这个例子中,我们尝试在modify方法中修改a的值,但是原始值被修改了。这是因为对象是引用传递的,所以在方法中的任何修改都会影响原始值。

总之,Java中的某些方法会修改原始值而有些则不会,这取决于参数的传递方式。基本数据类型是值传递的,而对象是引用传递的。在方法中修改对象属性时,原始值会被修改,而在方法中修改对象本身时,原始值不会被修改。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

白话梳理创建型设计模式:单例、原型,构建

原型模式和享元模式有些类似,都是尝试重用现有的同类实例,但是他们本质是不相同,原型模式对现有实例再加工,比如JS里原型设计,原型链,或者克隆当前实例;享元模式是对现有实例重复使用,比如Java...当修改系统文件时候,会复制原始文件到增量盘修改。创建文件只在增量盘创建 原型设计有许多和抽象工厂和建造者一样效果:它隐藏了具体实例类,因此减少了实例数目。...整体上讲,原型设计模式应用有两种: 第一种是通过改变结构、改变来指向新实例,把实例公共部分作为原型,比如Js实例一些事件函数,这种情况下,可以减少对同类实例相同部分创建,减少内存开销,...通对name赋值也可以看到,修改属性会直接覆盖原型。...,在构造过程 Bean 可能处于一种不一致状态,真的出现这种情况往往很难调试 另一种情况,这样写法,可以把一个Bean定义为不可变得,而使用传统形式很难实现。

25030

99%Java程序员会踩6个坑

有时候,某些代码,这一批数据功能正常,但换了一批数据就出现异常了。 有时候,你可能会看着某行代码目瞪口呆,心里想:这行代码为什么会出错?...有些同学可能会反驳,Integer不是有范围是:-128-127缓存吗? 为什么是false? 先看看Integer构造方法: 它其实并没有用到缓存。 那么缓存是在哪里用?...如果是Integer类型,再进一步判断int是否相等。 上面这个例子b是long类型,所以Integerequals方法直接返回了false。...在新版阿里巴巴开发手册,也推荐使用这种方式创建BigDecimal参数。 4. Java8 filter坑 对于Java8Stream用法,大家肯定再熟悉不过了。...其根本原因是:过滤后集合,保存是对象引用,该引用只有一份数据。 也就是说,只要有一个地方,把该引用对象成员变量,做修改了,其他地方也会同步修改。 如下图所示: 5.

47520
  • 27 个问题,告诉你Python为什么这么设计

    任何动作都不会 8 更改为其他,在 Python ,任何动作都不会将字符串 "8" 更改为其他为什么必须在方法定义和调用显式使用“self”? 这个想法借鉴了 Modula-3 语言。...为什么字典key必须是不可变? 字典哈希表实现使用从键值计算哈希来查找键。如果键是可变对象,可能会发生变化,因此其哈希也会发生变化。...但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。然后,当你尝试在字典查找相同对象时,将无法找到它,因为其哈希不同。...允许列表作为键,但告诉用户不要修改它们。当你意外忘记或修改列表时,这将产生程序一类难以跟踪错误。它还使一个重要字典不变量无效:d.keys() 每个都可用作字典键。...如果列表,元组或字典字面值分布在多行更容易添加更多元素,因为不必记住在上一行添加逗号。这些行也可以重新排序,不会产生语法错误。 不小心省略逗号会导致难以诊断错误。

    6.7K11

    @Configuration 注解 Full 模式和 Lite 模式!

    /core/beans/java/basic-concepts.html 这个文档主要讲了这样几件事情: 我们可以通过在一个方法上添加 @Bean 注解,进而将该方法返回暴露给 Spring 容器,...为什么要代理呢?肯定是为了实现某些功能。...dog 对象,就不会真正去执行 dog 方法获取到一个新 dog 对象了,如果 Spring 容器不存在 dog 对象,才会创建新 dog 对象出来。...另外,我们也可以在类上添加 @Configuration 注解,但是通过修改属性来启用 Lite 模式: @Configuration(proxyBeanMethods = false) public...Full 模式下,一个 @Bean 方法调用另外一个 @Bean 方法,动态代理方法会先去容器检查是否存在该 Bean,如果存在,直接使用容器 Bean,否则才会去创建新对象。

    22030

    Guava,拯救垃圾代码,效率提升N倍

    如果一个对象不需要支持修改操作,不可变集合将会节省空间和时间开销。 可以当作一个常量来对待,并且集合对象在以后也不会被改变。...Collections.unmodifiableList(…) 实现不是真正不可变集合,当原始集合被修改后,不可变集合里面的元素也是跟着发生变化。 我就不会犯这种错,来看下面的代码。...immutableList 并不会因此发生改变。...BiMap,一种特殊 Map,可以用 inverse() 反转BiMap 键值映射;保证是唯一,因此 values() 返回 Set 不是普通 Collection。...如果你愿意消耗一些内存空间来提升速度,你能预料到某些键会被查询一次以上,缓存存放数据总量不会超出内存容量,就可以使用 Cache。 来个示例你感受下吧。

    48120

    27 个问题,告诉你Python为什么这么设计?

    任何动作都不会 8 更改为其他,在 Python ,任何动作都不会将字符串 "8" 更改为其他为什么必须在方法定义和调用显式使用“self”? 这个想法借鉴了 Modula-3 语言。...为什么字典key必须是不可变? 字典哈希表实现使用从键值计算哈希来查找键。如果键是可变对象,可能会发生变化,因此其哈希也会发生变化。...但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。然后,当你尝试在字典查找相同对象时,将无法找到它,因为其哈希不同。...允许列表作为键,但告诉用户不要修改它们。当你意外忘记或修改列表时,这将产生程序一类难以跟踪错误。它还使一个重要字典不变量无效:d.keys() 每个都可用作字典键。...如果列表,元组或字典字面值分布在多行更容易添加更多元素,因为不必记住在上一行添加逗号。这些行也可以重新排序,不会产生语法错误。 不小心省略逗号会导致难以诊断错误。

    3.1K20

    【ES6基础】Symbol介绍:独一无二

    JS 也有类似的概念,它是根据传递数据类型推断。如果将传递给函数,重新分配该不会修改调用位置。但是,如果你修改是引用类型,那么修改也将在调用它地方被修改。...: '前端达人', regYear: '2018' } // 这个时候通过 weChat 来修改对象属性,通过 touTiao 来查看属性时对象属性已经发生改变; 那Symbol是什么数据类型呢?...但非常不巧是这个第三库同样需要对该DOM元素对象进行属性插入,恰好这个库所需要操作属性与前一个第三库所操作属性相同。...'] 3、定义类私有属性/方法 我们都清楚在JS,是没有如Java等面向对象语言访问控制关键字private,类上所有定义属性或方法都是可公开访问。...该方法会因为instanceof语句使用被调用,来检查一个对象是否是某一个类实例。

    55910

    jq使用splice删除数组元素出错解决方法

    jqsplice用于删除数组里某些元素,并且会改变原数组 定义和用法 splice() 方法向/从数组添加/删除项目,然后返回被删除项目。 注释:该方法会改变原始数组。...要删除项目数量。如果设置为 0,则不会删除项目。 item1, ..., itemX 可选。向数组添加新项目。 返回 类型 描述 Array 包含被删除项目的新数组,如果有的话。...如果从 arrayObject 删除了元素,返回是含有被删除元素数组。 浏览器支持 所有主流浏览器都支持 splice() 方法。...提示和注释 注释:请注意,splice() 方法与 slice() 方法作用是不同,splice() 方法会直接对数组进行修改。...原因在于,当删除arr[2],页就是删除3时候,arr数组将会重新进行计算索引,那时候是 arr=[1,2,4,5,6,7,8,9];i为1;那时候length为8 第二次循环依然可以删除

    1.9K20

    漫谈模式之原型模式

    Java,可以使用clone()方法来实现原型模式。 为什么要使用Clone呢? 在Java,使用clone()方法可以创建一个新对象副本,对它进行修改不会影响原始对象。...在某些场景,比如组卷场景,可以使用原型模式来创建多份相似的试卷,每份试卷只需要稍作修改即可。比如,如下是一个简单答辩试题随机卷示例,其题目都来自一样题库。...这是因为继承自是java.lang.Cloneable#clone()方法采用是浅拷贝。 如果要使克隆出来对象和原始对象是独立,我们需要采用深拷贝实现。...再测试一下,2者对象都是独立修改副本将不会影响原对象。...这样实现对象深拷贝。 有兴趣读者可以自行尝试一下。 优缺点适用环境 一般情况下 一般情况下,我们可以将一些具体原型对象放入到缓存,然后使用时候直接拿出来修改某些即可。

    32660

    【ES6基础】Symbol介绍:独一无二

    JS 也有类似的概念,它是根据传递数据类型推断。如果将传递给函数,重新分配该不会修改调用位置。但是,如果你修改是引用类型,那么修改也将在调用它地方被修改。...:{ name: '前端达人', regYear: '2018' } // 这个时候通过 weChat 来修改对象属性,通过 touTiao 来查看属性时对象属性已经发生改变; 那Symbol是什么数据类型呢...但非常不巧是这个第三库同样需要对该DOM元素对象进行属性插入,恰好这个库所需要操作属性与前一个第三库所操作属性相同。...] 3、定义类私有属性/方法 我们都清楚在JS,是没有如Java等面向对象语言访问控制关键字private,类上所有定义属性或方法都是可公开访问。...该方法会因为instanceof语句使用被调用,来检查一个对象是否是某一个类实例。

    88670

    Stream-快速入门Stream编程

    原始版本 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本 Stream,用户只要给出需要对其包含元素执行什么操作,比如 “过滤掉长度大于 10 字符串”、“获取每个字符串首字母...流看作在时间中分布一组。相反,集合则是空间(这里就是计算机内存)中分布一组,在一个时间点上全体存在——你可以使用迭代器来访问for-each循环中内部成员。...这个函数会被应用到每个元素上,并将其映射成一个新元素(使用映射一词,是因为它和转换类似,但其中细微差别在于它是“创建一个新版本”不是去“修改” 2.1 对流每一个元素应用 List<String...(encounterorder)来指定流项目出现逻辑顺序(比如由List或排序好数据列生成流)。...可以用它们来设置一条流 水线,但并不会生成任何结果。 forEach和count等终端操作会返回一个非流,并处理流水线以返回结果。 流元素是按需计算

    1.2K70

    JUnit:别再用 main 方法测试了,好吗?

    Java ,最小功能单元就是方法,因此,对 Java 程序员进行单元测试实际上就是对 Java 方法测试。 为什么要进行单元测试呢?...在测试方法内部,你可以使用 assertEquals() 对期望和实际进行比对。 第三步,你可以在邮件菜单中选择「Run FactorialTest」来运行测试用例,结果如下所示。 ?...单元测试可以确保单个方法按照正确预期运行,如果你修改了某个方法代码,只需确保其对应单元测试通过,即可认为改动是没有问题。 03、瞻前顾后 在一个测试用例,可能要对多个方法进行测试。...在上例,如果团队其他成员看到说明就会明白,当编号 43 bug 修复后,该测试方法会重新启用。...即便是为了提醒自己,也很有必要,因为时间长了你可能自己就忘了,当初是为什么要忽略这个测试方法。 05、条件测试 有时候,你可能需要在某些条件下运行测试方法,有些条件下不运行测试方法。

    1.4K30

    Python官方二十七问,你知道个啥?

    任何动作都不会 8 更改为其他,在 Python ,任何动作都不会将字符串 "8" 更改为其他。 05. 为什么必须在方法定义和调用显式使用“self”?...为什么字典 key 必须是不可变? 字典哈希表实现使用从键值计算哈希来查找键。如果键是可变对象,可能会发生变化,因此其哈希也会发生变化。...但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。然后,当你尝试在字典查找相同对象时,将无法找到它,因为其哈希不同。...允许列表作为键,但告诉用户不要修改它们。当你意外忘记或修改列表时,这将产生程序一类难以跟踪错误。它还使一个重要字典不变量无效:d.keys() 每个都可用作字典键。...如果列表,元组或字典字面值分布在多行更容易添加更多元素,因为不必记住在上一行添加逗号。这些行也可以重新排序,不会产生语法错误。 不小心省略逗号会导致难以诊断错误。

    2.5K20

    干货 | 27 个问题,告诉你 Python 为什么如此设计?

    任何动作都不会 8 更改为其他,在 Python ,任何动作都不会将字符串 "8" 更改为其他。 05. 为什么必须在方法定义和调用显式使用“self”?...为什么字典 key 必须是不可变? 字典哈希表实现使用从键值计算哈希来查找键。如果键是可变对象,可能会发生变化,因此其哈希也会发生变化。...但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。然后,当你尝试在字典查找相同对象时,将无法找到它,因为其哈希不同。...允许列表作为键,但告诉用户不要修改它们。当你意外忘记或修改列表时,这将产生程序一类难以跟踪错误。它还使一个重要字典不变量无效:d.keys() 每个都可用作字典键。...如果列表,元组或字典字面值分布在多行更容易添加更多元素,因为不必记住在上一行添加逗号。这些行也可以重新排序,不会产生语法错误。 不小心省略逗号会导致难以诊断错误。

    2.6K20

    Vue 3toRaw和markRaw使用

    避免无限循环 总结 欢迎来到Java学习路线专栏~探索Java静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒 ✨博客主页:IT·陈寒博客 该系列文章专栏:Java学习路线...这个函数非常有用,当您需要直接访问对象原始版本不触发代理getter方法时。...最后,我们使用toRaw来获取proxy原始版本,从而绕过了代理。这种操作可能在某些情况下非常有用,特别是当您需要与不理解Vue第三库或原生DOM操作进行交互时。...我们使用markRaw来创建一个原始对象original,它不会被代理。...但是请注意,尽管proxy是响应性,但original修改不会触发代理更新。这对于标记不需要响应性对象非常有用,以减少不必要性能开销。

    32210

    你真的知道Python字符串怎么用吗?

    最后,还做了两个扩展思考:为什么 Python 字符串不具备列表类型某些操作呢,为什么它不具备 Java 字符串一些操作呢?...拆分字符串还有一种方法,即 splitlines() ,这个方法会按行拆分字符串,它接收一个参数 True 或 False ,分别决定换行符是否会被保留,默认 False ,即不保留换行符。...查找字符串 查找字符串是否包含某些内容,这是挺常用操作。...说个形象比喻,Python 中共用一把秤,三教九流之辈都能拿它称重,Java 中有多把秤,你称你,我称我,大家“井水不犯河水”。...一面,Python 字符串做不到某些事,但是另一面,Python 可以出色地做成这些事,孰优孰劣,高下立判。 6.

    99830

    干货 | 27 个问题,告诉你 Python 为什么如此设计?

    任何动作都不会 8 更改为其他,在 Python ,任何动作都不会将字符串 "8" 更改为其他。 05. 为什么必须在方法定义和调用显式使用“self”?...为什么字典 key 必须是不可变? 字典哈希表实现使用从键值计算哈希来查找键。如果键是可变对象,可能会发生变化,因此其哈希也会发生变化。...但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。然后,当你尝试在字典查找相同对象时,将无法找到它,因为其哈希不同。...允许列表作为键,但告诉用户不要修改它们。当你意外忘记或修改列表时,这将产生程序一类难以跟踪错误。它还使一个重要字典不变量无效:d.keys() 每个都可用作字典键。...如果列表,元组或字典字面值分布在多行更容易添加更多元素,因为不必记住在上一行添加逗号。这些行也可以重新排序,不会产生语法错误。 不小心省略逗号会导致难以诊断错误。

    2.7K10

    Python 核心设计理念27个问题及解答

    任何动作都不会 8 更改为其他,在 Python ,任何动作都不会将字符串 "8" 更改为其他。 05. 为什么必须在方法定义和调用显式使用“self”?...为什么字典 key 必须是不可变? 字典哈希表实现使用从键值计算哈希来查找键。如果键是可变对象,可能会发生变化,因此其哈希也会发生变化。...但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。然后,当你尝试在字典查找相同对象时,将无法找到它,因为其哈希不同。...允许列表作为键,但告诉用户不要修改它们。当你意外忘记或修改列表时,这将产生程序一类难以跟踪错误。它还使一个重要字典不变量无效:d.keys() 每个都可用作字典键。...如果列表,元组或字典字面值分布在多行更容易添加更多元素,因为不必记住在上一行添加逗号。这些行也可以重新排序,不会产生语法错误。 不小心省略逗号会导致难以诊断错误。

    3.3K21

    Web前端性能优化教程05:配置ETag

    答案有两种方式,一种是前面提到ETag,另一种是根据最新修改时间。先来看看最新修改时间。 最新修改时间 原始服务器通过Last-Modified响应头来返回组件最新修改时间。...一些文件也许会周期性更改,但是他内容并不改变(仅仅改变修改时间),这个时候我们并不希望客户端认为这个文件被修改了,重新GET; 2....某些文件修改非常频繁,比如在秒以下时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到粒度是s级,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);...某些服务器不能精确得到文件最后修改时间。 ETag带来问题 ETag问题在于通常使用某些属性来构造它,有些属性对于特定部署了网站服务器来说是唯一。...确定要使用ETag,在配置ETag时候,移除可能影响到组件集群服务器验证属性,例如只包含组件大小和时间戳。

    1.3K60
    领券