Java 基础面试题, Java 中的参数传递是按值还是按引用?
Java 基础面试题, Java 中的参数传递是按值还是按引用?
QA
Step 1
Q:: Java 中的参数传递是按值还是按引用?
A:: 在 Java 中,所有参数传递都是按值传递的。当基本类型的参数传递给方法时,方法接收到的是该值的副本,对该副本的修改不会影响原始值。而当对象类型作为参数传递时,传递的是对象引用的副本,即引用的值。这意味着方法接收到的是指向同一个对象的引用,对对象属性的修改会影响原始对象,但对引用本身的重新赋值不会影响原始引用。
Step 2
Q:: Java 中的参数传递机制与 C++
中的区别是什么?
A:: Java 中只有按值传递,而 C++ 支持按值传递和按引用传递。在 C++
中,可以通过传递指针或引用来改变调用者的值,而在 Java 中,方法只能通过修改传递的对象的属性来间接影响原始对象。
Step 3
Q:: 在 Java 中,如何避免不小心修改对象的属性?
A:: 为了避免在方法中不小心修改对象的属性,可以使用不可变对象(Immutable Objects)。Java 中常见的不可变类包括 String、Integer、Float 等。通过使用这些不可变类,可以确保对象一旦创建,其状态就不能被修改。
Step 4
Q:: 什么是深拷贝和浅拷贝,它们在 Java 中的区别是什么?
A:: 浅拷贝(Shallow Copy)是指复制对象时仅复制对象的引用,不复制对象引用的实际内容。深拷贝(Deep Copy)则是复制对象以及所有对象引用的内容。在 Java 中,可以通过重写 clone()
方法来实现深拷贝。浅拷贝适合对不可变对象的操作,而深拷贝适合需要完全隔离副本和原对象的场景。
Step 5
Q:: 在 Java 中 String 是如何实现不可变性的?
A:: 在 Java 中,String 类是不可变的,这意味着一旦 String 对象被创建,它的值就不能被修改。String 的不可变性是通过将其内部的字符数组声明为 final
来实现的,同时不提供修改该字符数组的方法。每次对 String 进行修改操作时,都会生成一个新的 String 对象。