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面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?相关推荐

  1. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递

    问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  (下面内存图解:栈内存是先进后出的,画错了 ) 答:是值传递.Java ...

  2. Java中的值传递和引用传递

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?      答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为 ...

  3. Java值传递与引用传递

    Java面试题: 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案基本上是:值传递 说明:得出这种结论的前提必须是&qu ...

  4. 基础回顾(正则、循环、和、 int和Integer、String /StringBuffer、Array和ArrayList、值传递和引用传递、 Lamda、java8)

    1. 正则表达式 1.1 Java中是如何支持正则表达式操作的? Java中的String类提供了支持正则表达式操作的方法,包括:matches().replaceAll().replaceFirst ...

  5. java 地址传递 返回值_Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  6. string 引用没有设置为 string 的实例。 参数名: s_Java中的值传递和引用传递,看完这篇终于终于明白了!...

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个参数 ...

  7. java形参、实参、值传递、引用传递

    工作中,发现大多数人对值传递,引用传递理解不深,下面写一遍文章详细聊聊. 一.形参 形参:用来接收调用方法时传递的参数,只有在被调用时才分配内存,一旦调用结束,就释放内存空间.因此仅在方法内有效. p ...

  8. Java编程语言是什么传递,即值传递和引用传递的区别

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案是:值引用 因为Java编程语言只有值传递参数. 当一个对象实例作为一个 ...

  9. java形参_java形参、实参、值传递、引用传递

    工作中,发现大多数人对值传递,引用传递理解不深,下面写一遍文章详细聊聊. 一.形参 形参:用来接收调用方法时传递的参数,只有在被调用时才分配内存,一旦调用结束,就释放内存空间.因此仅在方法内有效. p ...

最新文章

  1. 图解CAN总线数据的组成和帧格式
  2. 表中查询重复的数据,如何通过sql语句查询?
  3. Android RecycleView ScrollBy不生效
  4. revit2019 导出obj_revit、3dmax导出object文件软件操作说明.doc
  5. 【机器视觉】 dev_error_var算子
  6. oracle 中增加行,Oracle中实现FORM表单插入、锁定、更新行、删除行的包
  7. Android开发笔记(七十七)图片缓存算法
  8. 计算几何05_B样条曲线
  9. 使360浏览器自动使用最高IE内核
  10. 3w+字,Python办公自动化之Excel报表自动化,看这一篇就够了!
  11. ps aux 中rss的单位
  12. K8S------概述
  13. C语言多文件编译的精神内核-讲透多文件编译攻略
  14. 机器视觉之缺陷检测的光源
  15. 《计算机网络》网络层之划分子网
  16. A Simple Math Problem题目翻译
  17. 事务统计系统软件 php,PHP数据库事务处理
  18. TeXstudio在右边显示预览
  19. ComboxBox 调整字体
  20. 一.Redis入门指南总结--认识Redis

热门文章

  1. appium和airtest_关于Airtest自动化测试工具
  2. [转载] Java:获取数组中的子数组的多种方法
  3. scala 多线程_Scala中的多线程
  4. eclipse配置python开发环境_eclipse怎样搭建Python开发环境
  5. ruby hash添加数据_如何在Ruby中向Hash添加元素?
  6. duration java_Java Duration类| 带示例的getUnits()方法
  7. getsimplename_Java类类getSimpleName()方法的示例
  8. 列表使用与内部实现原理
  9. Cookie的设置获取和删除
  10. html5 java 图片上传_java实现图片上传至服务器并显示,如何做?希望要具体的代码实现...