java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递。Java编程语言只有值传递参数。
当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
1.Java中没有指针,所以也没有引用传递了,仅仅有值传递。不过,可以通过对象的方式来实现引用传递。类似java没有多继承,但可以用多次implements接口实现多继承的功能。
2.在Java应用程序中永远不会传递对象,而只传递对象的引用。因此是按引用传递对象。但重要的是要区分参数是如何传递的。
3.Java应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java应用程序是按值传递对象引用的。
4.Java应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的。**两种类型都是按值传递的,**没有一种按引用传递。
按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。
按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数的值,调用代码中的原始值也随之改变。如果函数修改了该参数的地址,调用代码中的原始值不会改变。
值传递: 方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中,对形式参数值的改变不影响实际参数的值。
**引用传递 **:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
示例代码如下:
// 在函数中传递的是基本数据类型
public class Test { public static void main(String[] args) { int a = 3; int b = 4; change(a, b); System.out.println("a=" + a); // 3System.out.println("b=" + b); // 4 } public static void change(int i, int j) { int temp = i; i = j; j = temp; }
} 结果为: a=3
b=4
原因:参数中传递的是基本数据类型a和b的拷贝,在函数中交换的也是那份拷贝的值,而不是数据本身。
// 在函数中传的是引用数据类型
public class Test { public static void main(String[] args) { int[] count = { 1, 2, 3, 4, 5 }; change(count); Sysout.out.println(count[0]); // 6} public static void change(int[] counts) { counts[0] = 6; }
}
结果为:6原因:在方法中,传递引用数据类型int数组,实际上传递的是该数组的地址值,他们都指向数组对象,在方法中可以改变数组对象的内容。
// 传递的是对象的引用
class A { int i = 0;
} public class Test { public static void main(String args[]) { A a = new A(); add(a); // 1 System.out.println(a.i); // 0} public static void add(A a) { a = new A(); a.i++;System.out.println(a.i); }
}结果为:
10 原因:在该程序中,对象的引用指向的是A,而在add方法中,传递的引用的一份副本则指向了一个新的对象,并对新的对象进行操作。而原来的A对象并没有发生任何变化。引用指向的是还是原来的A对象。
// String 不改变,数组改变
public class Example { public static void main(String args[]) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.print(ex.str + " and "); // good andSystem.out.println(ex.ch); // gbc} String str = new String("good"); // good 是常量,不能改char[] ch = { 'a', 'b', 'c' }; public void change(String str, char ch[]) { str = "test ok"; // test ok 又是一个常量,也不能改 等价于 String str1 = new String("test ok");ch[0] = 'g'; }
} 结果为:good and gbc 原因:String类比较特别,看过String类代码的都知道,String类是final修饰的。所以值是不变的。
函数中String对象引用的副本指向了另外一个新String对象,而数组对象引用的副本没有改变,而是改变对象中数据的内容。
对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值;但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?相关推荐
- 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? (下面内存图解:栈内存是先进后出的,画错了 ) 答:是值传递.Java ...
- Java中的值传递和引用传递
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为 ...
- Java值传递与引用传递
Java面试题: 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案基本上是:值传递 说明:得出这种结论的前提必须是&qu ...
- 基础回顾(正则、循环、和、 int和Integer、String /StringBuffer、Array和ArrayList、值传递和引用传递、 Lamda、java8)
1. 正则表达式 1.1 Java中是如何支持正则表达式操作的? Java中的String类提供了支持正则表达式操作的方法,包括:matches().replaceAll().replaceFirst ...
- java 地址传递 返回值_Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- string 引用没有设置为 string 的实例。 参数名: s_Java中的值传递和引用传递,看完这篇终于终于明白了!...
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个参数 ...
- java形参、实参、值传递、引用传递
工作中,发现大多数人对值传递,引用传递理解不深,下面写一遍文章详细聊聊. 一.形参 形参:用来接收调用方法时传递的参数,只有在被调用时才分配内存,一旦调用结束,就释放内存空间.因此仅在方法内有效. p ...
- Java编程语言是什么传递,即值传递和引用传递的区别
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案是:值引用 因为Java编程语言只有值传递参数. 当一个对象实例作为一个 ...
- java形参_java形参、实参、值传递、引用传递
工作中,发现大多数人对值传递,引用传递理解不深,下面写一遍文章详细聊聊. 一.形参 形参:用来接收调用方法时传递的参数,只有在被调用时才分配内存,一旦调用结束,就释放内存空间.因此仅在方法内有效. p ...
最新文章
- 图解CAN总线数据的组成和帧格式
- 表中查询重复的数据,如何通过sql语句查询?
- Android RecycleView ScrollBy不生效
- revit2019 导出obj_revit、3dmax导出object文件软件操作说明.doc
- 【机器视觉】 dev_error_var算子
- oracle 中增加行,Oracle中实现FORM表单插入、锁定、更新行、删除行的包
- Android开发笔记(七十七)图片缓存算法
- 计算几何05_B样条曲线
- 使360浏览器自动使用最高IE内核
- 3w+字,Python办公自动化之Excel报表自动化,看这一篇就够了!
- ps aux 中rss的单位
- K8S------概述
- C语言多文件编译的精神内核-讲透多文件编译攻略
- 机器视觉之缺陷检测的光源
- 《计算机网络》网络层之划分子网
- A Simple Math Problem题目翻译
- 事务统计系统软件 php,PHP数据库事务处理
- TeXstudio在右边显示预览
- ComboxBox 调整字体
- 一.Redis入门指南总结--认识Redis
热门文章
- appium和airtest_关于Airtest自动化测试工具
- [转载] Java:获取数组中的子数组的多种方法
- scala 多线程_Scala中的多线程
- eclipse配置python开发环境_eclipse怎样搭建Python开发环境
- ruby hash添加数据_如何在Ruby中向Hash添加元素?
- duration java_Java Duration类| 带示例的getUnits()方法
- getsimplename_Java类类getSimpleName()方法的示例
- 列表使用与内部实现原理
- Cookie的设置获取和删除
- html5 java 图片上传_java实现图片上传至服务器并显示,如何做?希望要具体的代码实现...