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); // 3 System.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); // 6 } public static void change(int[] counts) { counts[0] = 6; System.out.println(counts[0]); } }
结果为: 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); } } 结果为:
1
0 原因:在该程序中,对象的引用指向的是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 and System.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的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值;但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python 调用 selenium chromedriver 常用配置
话不多说,上示例代码 from selenium import webdriver import time chromedriver = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe" #设置不加载图片 chrome_opt = webdriver.ChromeOptions() prefs = {"profile.managed_default_content_settings.images": 2} chrome_opt.add_experimental_option("prefs", prefs) dirver = webdriver.Chrome(executable_path=chromedriver, chrome_options=chrome_opt) dirver.get("https://www.zhihu.com/signup?next=%2F") #获取页面HTML html = driver.page_source dirver.find_element_by_xp...
- 下一篇
java基础和面向对象面试题_01
java基础和面向对象面试题_01 ============================================================================= 逻辑思考题: 1:矿泉水1元钱1瓶,每2个空瓶换一瓶矿泉水,现有20元钱,请问可以买多少瓶矿泉水? 20 (虽然感觉有道理,但是肯定不是这个) 39 程序员 40 销售 – 管理岗位 逻辑思维能力是没有问题的: 39=20+10+5+2+1+1和1个空瓶子 如何能达到40呢? (请问可以买多少瓶矿泉水?应改为:你可以喝到多少瓶矿区水?40瓶才能成立) 借一个。 如何借?考验交流沟通能力。 1个空瓶子先给商店,再向别人借一个,喝完水,再把瓶子还给别人。 ----------------------------------------------------------------------------- 2:下面这个表达式,你移动一个数字或者符号就可以把这个表达式变成正确的。请试试: 62-63=1 把6移动到2的次方位置。2的6次方是64。 2的10次幂以内的值要非常的敏感。 ---------...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装