首页 > 试题广场 >

关于Java中参数传递的说法,哪个是错误的?

[单选题]
关于Java中参数传递的说法,哪个是错误的?
  • 在方法中,修改一个基础类型的参数不会影响原始参数值
  • 在方法中,改变一个对象参数的引用不会影响到原始引用
  • 在方法中,修改一个对象的属性会影响原始对象参数
  • 在方法中,修改集合和Maps的元素不会影响原始集合参数
B我觉得也是错的。两个引用指向同一个堆内存空间,那么,改变其中的一个另一个肯定也会改变
发表于 2019-06-27 14:26:03 回复(8)
更多回答
答案: D
解析: 注意!Java中方法的参数传递都是值传递
A. 在方法中,修改一个基础类型的参数不会影响原始参数值
public static void main(String []args){
    int i = 5;   
    func(i);
    System.out.println(i);
}
static void func(int j){
    j = 10;
}

//输出结果
5
在主方法调用func(int j) 时 , 参数i是实际参数 , 值为5 , 参数j是形式参数 , 值是i给的 , 也是5 , i和j没有任何关系 , 是两个独立的参数 , 所以修改j的值时与i没有关系 , 仍然输出5。

B. 在方法中,改变一个对象参数的引用不会影响到原始引用
public static void main(String []args){
    User rabbiter = new User();
    rabbiter.setName("rabbiter");
    func(rabbiter);
    System.out.println(rabbiter.getName());
}
static void func(User user){
    user = new User();
    user.setName("zhangsan");
}

//输出结果
rabbiter
在主方法调用func(User user) 时 , 对象rabbiter保存的是一个地址值 , 本质上就是把rabbiter的地址值给了形参user , 所以此时实参rabbiter和形参user指向在堆中的同一个对象 , 他们的地址值相同 , 只是指向的对象一致 , 所以并不违反值传递的理论。
此时 , 如果修改形参user , new一个新的对象并让user指向它 , 修改的只是形参保存的地址 , 与实参rabbiter无关 , rabbiter指向的对象仍然是之前的那个对象。

C. 在方法中,修改一个对象的属性会影响原始对象参数
public static void main(String []args){
    User rabbiter = new User();
    rabbiter.setName("rabbiter");
    func(rabbiter);
    System.out.println(rabbiter.getName());
}
static void func(User user){
    user.setName("zhangsan");
}

//输出结果
zhangsan
在主方法调用func(User user) 时 , 对象rabbiter保存的是一个地址值 , 本质上就是把rabbiter的地址值给了形参user , 所以此时实参rabbiter和形参user指向在堆中的同一个对象 , 他们的地址值相同 , 指向的对象一致 , 所以并不违反值传递的理论。
那么user对其指向的对象的属性name进行修改 , rabbiter指向的对象的name属性也就被修改了。

D. 在方法中,修改集合和Maps的元素不会影响原始集合参数
集合和Maps都是对象 , 所以此项跟C选项的解析一致。
编辑于 2020-03-27 22:12:23 回复(27)
B 改变栈内引用是改变引用地址让它指向其他对象,而不是改变引用地址指向的对象。。 是这个意思吗?
发表于 2019-09-24 11:35:17 回复(0)
来解释一下B选项为什么正确吧。

在Java里,只有值传递,因为引用本身就是一个地址值,我们说的”传递引用“本质上也是“值传递”,只不过传递的是地址值。

在方法中,改变一个对象参数的引用不会影响到原始引用。这是很自然的。
举个例子,假设在函数外有 A a = new A();那么引用a指向堆中的一个对象A()。
假设有一个函数:
void f(A a) {
    a = new A();
}
显然,这里a指向了堆中的另一个对象A(),而在函数外的那个引用a依然没有改变,指向原来的对象A()。
发表于 2019-07-04 15:06:50 回复(8)
转载别人的一篇博客
A、在方法中,修改一个基础类型的参数永远不会影响原始参数值。

B、在方法中,改变一个对象参数的引用永远不会影响到原始引用。然而,它会在堆中创建了一个全新的对象。(译者注:指的是包装类和immutable对象)

C、在方法中,修改一个对象的属性会影响原始对象参数。

D、在方法中,修改集合和Maps会影响原始集合参数。
 ———————————————— 

原文链接:https://blog.csdn.net/scholar_man/article/details/80900212
发表于 2019-08-22 16:44:49 回复(2)

java只有值传递,很多人还没搞明白这一点

发表于 2019-07-03 10:05:29 回复(2)
72%头像 72%
在方法中改变了对象的引用,指的是仅仅改变引用而已,对象还是那个对象。
就相当于你银行卡丢了,你重新补办换了一张卡,变的是银行卡,而你卡里的钱一分都没少。
发表于 2019-12-17 20:58:02 回复(1)
d 为什么是错的 在集合中都有一个modcount属性 用来统计修改次数 所以每次修改这个属性都会改变
发表于 2020-02-12 16:58:17 回复(0)
方法传入的参数是一个副本,基本数据类型就是值相同,引用类型就是相同地址引用。
A修改基本数据类型,与原变量无关。
B改变参数引用,即将这个引用指向另一地址,而原引用对象仍然指向原地址。
C改变属性相当于修改引用指向的地址上保存的数据,比方说都指向一个Person person,修改了age就是修改了这个类的属性。
DMaps和集合也是引用对象。同C
发表于 2020-03-10 22:15:47 回复(0)
d选项  修改集合和map中的数据会影响原始集合数据,因为他们指向的是同一块内存地址。
发表于 2022-09-14 17:22:45 回复(0)
传递的参数是对象时,传递的是对象的引用地址的复制。改变参数的引用地址时,原对象还是指向原来的引用地址,故原对象不变。改变引用地址的内容时,因为原对象和参数都是指向这一个引用地址,所以原对象也会改变。
发表于 2021-12-31 14:32:15 回复(0)
B选项玩的是文字游戏,改变对象参数的引用,当然不会影响到原始的引用,影响的是原始的参数的引用,应该是这样吧, 看了评论比较高的题解,我怀疑人生了
发表于 2021-08-14 01:22:15 回复(0)
在方法中,改变一个对象参数的引用不会影响到原始引用
在方法中,修改一个对象的属性会影响原始对象参数
在方法中,修改集合和Maps的元素会影响原始集合参数
发表于 2021-04-28 20:17:23 回复(0)

1.Java中没有指针,所以也没有引用传递了,仅仅有值传递。不过,可以通过对象的方式来实现引用传递。类似java没有多继承,但可以用多次implements接口实现多继承的功能。

2.在Java应用程序中永远不会传递对象,而只传递对象的引用。因此是按引用传递对象。但重要的是要区分参数是如何传递的。

3.Java应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java应用程序是按值传递对象引用的。

4.Java应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的。两种类型都是按值传递的,没有一种按引用传递。

发表于 2020-08-07 08:41:06 回复(0)
改变一个对象参数的引用不会影响到原始引用...
有C基础的,,类似改了指针的值,但是以前那个指针指向对象的值没有改变,,只是改了指针...

发表于 2019-07-29 22:55:14 回复(1)
很果断的选了B😂
发表于 2019-07-11 07:52:31 回复(0)
Java中方法的参数传递都是值传递
发表于 2022-11-15 09:59:35 回复(0)
<p>这题考形参的修改对实参的影响</p>
发表于 2020-12-04 11:08:18 回复(0)
在方法中,改变一个对象参数的引用不会影响到原始引用

//引用传参:本质是传的是地址:会使该形参引用指向原对象;同时修改该形参就会修改原对象
         不过B选项说的是原引用,那根本就没关系,原引用不会受到影响

发表于 2020-06-04 19:59:35 回复(1)
关于D,是不是错了??
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("original");
modifyList(list);
System.out.println(list); // 输出: [modified]

Map<String, String> map = new HashMap<>();
map.put("key", "original");
modifyMap(map);
System.out.println(map); // 输出: {key=modified}
}
public static void modifyList(List<String> list) {
list.set(0, "modified");
}
public static void modifyMap(Map<String, String> map) {
map.put("key", "modified");
}
}

发表于 2023-11-16 10:25:11 回复(0)