Java中参数传递类型只有值传递

简介:

Java核心技术卷I里有一个结论我觉得挺有意思的:java中没有引用传递,只有值传递

  首先看定义:

  值传递,是指方法接收的是调用者提供的值

  引用传递,是指方法接收的是调用者提供的变量地址

  以前学习C++时把参数传递分为值传递和引用传递,国内的不少java教材愿意把对象的传递理解是引用传递,为什么它们会这么说呢?可以看下面一个例子:

import java.util.Calendar;
public class ChangeValue {

public static void main(String[] args) {  
    Calendar oc = Calendar.getInstance();  
    System.out.println("origin:"+oc.getTime());  
    changeDate(oc);  
    System.out.println("after:"+oc.getTime());        
}  
  
static void changeDate(Calendar pd){  
    pd.set(1970, 1, 1);  
}  

}
  某时刻程序输出:

origin:Thu Jan 05 21:15:59 CST 2012
after:Sun Feb 01 21:15:59 CST 1970
  oc对象的值改变了,很多人就认为java对象传递实际上是引用传递。

  过程应该是这样的:

  运行changeDate这个函数时,方法得到的是对象引用的拷贝,oc和pd同时引用同一个对象,所以函数运行结束后,pd已经消失了,但是对引用对象的更改却也影响了oc所引用的同一对象,结合对之前的定义理解,这应该是值传递的过程(传递的是对象引用的拷贝)。

  以下附上另一个例子,两个对象的交换函数(C++中可以轻易实现):

public class Swap {

public static void main(String[] args) {  
    ObjectSample o1 = new ObjectSample("hello");  
    ObjectSample o2 = new ObjectSample("你好");  
    System.out.println("before swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());  
    Swap.swapObject(o1, o2);  
    System.out.println("after swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());  
}  
static void swapObject(ObjectSample o1, ObjectSample o2){  
    ObjectSample temp = new ObjectSample("temp");  
    temp = o1;  
    o1 = o2;  
    o2 = temp;  
}  

}
class ObjectSample{

private String title;  
  
ObjectSample(String title){  
    this.title = title;  
}  
  
public String getTitle(){  
    return title;  
}  

}
  输出结果:

before swap o1:hello o2:你好
after swap o1:hello o2:你好
  Java在交换程序中并没有交换两个对象的值,交换的是两个对象的拷贝,不能实现让对象参数引用一个新对象,究其原因还是因为Java是采用了值传递而非引用传递。

  还有不少和以前自己接触的观点不一样的地方,当然需要借鉴的吸收并且经过自己的实践来辨别。

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

目录
相关文章
|
2月前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
2月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
84 2
|
2月前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
泛型擦除是指Java编译器在编译期间会移除所有泛型信息,使所有泛型类型在运行时都变为原始类型。例如,`List<String>` 和 `List<Integer>` 在JVM中都视为 `List`。因此,通过 `getClass()` 比较两个不同泛型类型的 `ArrayList` 实例会返回 `true`。此外,通过反射调用 `add` 方法可以向 `ArrayList<Integer>` 中添加字符串,进一步证明了泛型信息在运行时被擦除。
49 2
|
3月前
|
Java 编译器
Java“返回类型为 void 的方法不能返回一个值”解决
在 Java 中,如果一个方法的返回类型被声明为 void,那么该方法不应该包含返回值的语句。如果尝试从这样的方法中返回一个值,编译器将报错。解决办法是移除返回值语句或更改方法的返回类型。
278 5
|
3月前
|
设计模式 Java
Java“不能转换的类型”解决
在Java编程中,“不能转换的类型”错误通常出现在尝试将一个对象强制转换为不兼容的类型时。解决此问题的方法包括确保类型间存在继承关系、使用泛型或适当的设计模式来避免不安全的类型转换。
331 7
|
3月前
|
Java
Java 中锁的主要类型
【10月更文挑战第10天】
|
3月前
|
安全 Java
Java“不兼容类型” 错误怎么查找解决
在 Java 中遇到“不兼容类型”错误时,首先理解错误信息,它表明试图将一种类型赋给不兼容的类型。检查代码中类型不匹配的赋值、方法调用参数类型不匹配、表达式类型不兼容及泛型类型不匹配等问题。解决方法包括进行类型转换、修改代码逻辑、检查方法参数和返回类型以及处理泛型类型不匹配。通过这些步骤,可以有效解决“不兼容类型”错误,确保代码类型兼容性良好。
568 9
|
4月前
|
存储 Java Windows
java基础(9)数据类型中的char类型以及涉及到的转义字符
Java中的char类型可以存储一个中文字符,因为它占用两个字节。转义字符允许在代码中使用特殊字符,例如`\n`表示换行,`\t`表示制表符,`\\`表示反斜杠,`\'`表示单引号,`\"`表示双引号。可以使用`\u`后跟Unicode编码来表示特定的字符。
85 2
java基础(9)数据类型中的char类型以及涉及到的转义字符
|
3月前
|
Java 程序员 编译器
Java中的异常类型
Java中的异常类型
28 3
|
3月前
|
Java 开发者
Java“类 Y 中的方法 X 不能应用于给定类型”解决
在Java中遇到“类Y中的方法X无法应用于给定类型”的错误时,通常是因为方法调用时的参数类型与定义不符。解决此问题需检查方法签名,确保传递的参数类型正确无误,或使用显式类型转换以匹配方法所需的参数类型。这种错误提示帮助开发者及时修正类型不匹配的问题。
135 1