- 浏览: 5028613 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (2844)
- java (1094)
- hadoop (37)
- jvm (39)
- hbase (11)
- sql (25)
- 异常 (83)
- div css (6)
- 数据库 (95)
- 有趣的code (15)
- struts2 (6)
- spring (124)
- js (44)
- 算法 (65)
- linux (36)
- hibernate (7)
- 中间件 (78)
- 设计模式 (2)
- 架构 (275)
- 操作系统 (91)
- maven (35)
- tapestry (1)
- mybatis (9)
- MQ (101)
- zookeeper (18)
- 搜索引擎,爬虫 (208)
- 分布式计算 (45)
- c# (7)
- 抓包 (28)
- 开源框架 (45)
- 虚拟化 (12)
- mongodb (15)
- 计算机网络 (2)
- 缓存 (97)
- memcached (6)
- 分布式存储 (13)
- scala (5)
- 分词器 (24)
- spark (104)
- 工具 (23)
- netty (5)
- Mahout (6)
- neo4j (6)
- dubbo (36)
- canal (3)
- Hive (10)
- Vert.x (3)
- docker (115)
- 分布式追踪 (2)
- spring boot (5)
- 微服务 (56)
- 淘客 (5)
- mesos (67)
- php (3)
- etcd (2)
- jenkins (4)
- nginx (7)
- 区块链 (1)
- Kubernetes (92)
- 驾照 (1)
- 深度学习 (15)
- JGroups (1)
- 安全 (5)
- 测试 (16)
- 股票 (1)
- Android (2)
- 房产 (1)
- 运维 (6)
- 网关 (3)
最新评论
-
明兜3号:
部署落地+业务迁移 玩转k8s进阶与企业级实践技能(又名:Ku ...
Kubernetes系统常见运维技巧 -
q328965539:
牛掰啊 资料收集的很全面
HDFS小文件处理解决方案总结+facebook(HayStack) + 淘宝(TFS) -
guichou:
fluent挂载了/var/lib/kubelet/pods目 ...
kubernetes上部署Fluentd+Elasticsearch+kibana日志收集系统 -
xu982604405:
System.setProperty("java.r ...
jmx rmi 穿越防火墙问题及jmxmp的替代方案 -
大漠小帆:
麻烦问下,“获取每个Item相似性最高的前N个Item”,这个 ...
协同过滤推荐算法在MapReduce与Spark上实现对比
函数中参数传递的两种类型
2.1 1.参数类型为基本类型 如 int float 等等
2.参数类型为对象,接口引用类型
值传递,是指方法接收的是调用者提供的值
引用传递,是指方法接收的是调用者提供的变量地址
基本类型传递举例
[java] view plaincopy
1. public class PersonDemo
2. {
3. public static void main(String[] args)
4. {
5. int n =100;
6. System.out.println(n);
7. changeN(n);
8. System.out.println(n);
9. }
10.
11. public static int changeN(int a)
12. {
13. return a = a+1;
14. }
15. }
相信大家都知道结果:
100
100
从这里,我们都可以看出java中方法的参数传递是按值传递的。
2.2 参数类型为对象类型 如Person
例子一
[java] view plaincopy
1. public class PersonDemo
2. {
3. public static void main(String[] args)
4. {
5. Person p = new Person();
6. p.age = 10;
7. System.out.println("传递前age=" +p.age);
8. changeAge(p);
9. System.out.println("传递后age=" +p.age);
10. }
11. public static int changeN(int a)
12. {
13. return a = a+1;
14. }
15. public static void changeAge(Person per)
16. {
17. per.age += 10;
18. }
19. }
20.
21. class Person
22. {
23. int age;
24. }
输出结果:
传递前age=10
传递后age=20
可能有人会想 例子一这里传递的是对象的引用。
例子二
[java] view plaincopy
1. public class PersonDemo
2. {
3. public static void main(String[] args)
4. {
5. Person p = new Person();
6. p.age = 10;
7. System.out.println("传递前age=" +p.age);
8. changePerson(p);
9. System.out.println("传递后age=" +p.age);
10. }
11. public static int changeN(int a)
12. {
13. return a = a+1;
14. }
15. public static void changeAge(Person per)
16. {
17. per.age += 10;
18. }
19. public static void changePerson(Person per)
20. {
21. Person p1 = new Person();
22. p1.age = 50;
23. per =p1;
24. }
25. }
26. class Person
27. {
28. int age;
29. }
输出结果
传递前age=10
传递后age=10
可能有人会想 例子二中这里传递的是对象的引用的一个复制。
我的理解是这样的。
实参是 Persion p =new Person();
形参是 Person per = p ;(一个实参的引用拷贝)
对于第二种参数传入类型为对象的情况,解释有3种
说法1 参数是按引用传递的,对于说法1 还有两
种解释,
解释1 引用传递时是传入对象的引用
解释2 引用传递时是传入对象引用的复制:就相当于这个Person per = p;
说法2 参数是按值传递
到底关于对象类型的参数,java中是按什么传递的,
其实java中不管是对象参数还是基本类型参数,都是按值传递的。
我们可以对方法中参数某些值进行打印 比如 Hashcode
这是部分代码 Person类可以参考上面定义的。
[java] view plaincopy
1. public class PersonDemo
2. {
3.
4. public static void main(String[] args)
5. {
6. Person p = new Person();
7. System.out.println("传递前hascode=" +p.hashCode());
8. hc(p);
9. }
10.
11. public static void hc(Person per)
12. {
13. System.out.println("传递后hascode=" +per.hashCode());
14. }
15. }
输出结果
传递前hascode=29855319
传递后hascode=29855319
我们可以看出 参数中传递进来的对象的hashcode和参数外面的一样。
我们再看一个例子
[java] view plaincopy
1. public class PersonDemo
2. {
3. static Person CP = new Person();
4. public static void main(String[] args)
5. {
6. equalPer(CP);
7. }
8.
9. public static void equalPer(Person per)
10. {
11. System.out.println("比较对象结果:" +(per == CP));
12. }
13. }
输出结果
比较对象结果:true
用==进行比较, 我们一直都认为是比较的值相等,而不是内容。
查看JDK文档中队 hashcode方法的描述,有这么一段话
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。
这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
通过上面的分析,关于对象传递,传递的是对象的一个引用(这里的引用跟c++中的引用不是一回事),这里的引用对象
是"该对象的内部地址转换成一个整数" ,其实就是一个整数。
所以我们可以肯定了java中不管是对象参数还是基本类型参数,都是按值传递的。
附带说明:
c++里面关于对象的一些知识
c++也是面向对象的语言,c++里面建立对象的方法是 :Person * p1 = new Person;
new出来返回的是一个对象的指针,java中没有指针这个说法。
而这个栈上的指针p也是指向堆上的new Person对象。
貌似跟java很类似,的确很类似 如果你在c++中也实现类似的改变Person中age的方法
[cpp] view plaincopy
1. public void changeAge(Person * p)
2. {
3. p->age += 10;
4. }
他也改变 Person中age的值。他传入的是一个指针类型,从这个角度可以看出,C++中传递是按值传递的。
C++中按引用传递的方式是这样的
[cpp] view plaincopy
1. public void changeAge(Person & p)
2. {
3. p.age += 10;
4. }
发表评论
-
Kryo 使用指南
2017-12-05 20:14 20071、Kryo 的简介 Kryo 是一个快速序列化/ ... -
spring session序列化问题排查
2017-12-01 19:07 6264严重: Servlet.service() for ser ... -
利用junit对springMVC的Controller进行测试
2017-11-30 16:26 1441平时对junit测试service/D ... -
Java内存模型之重排序
2017-11-29 09:44 858在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重 ... -
pmd spotbugs 文档
2017-11-28 10:02 0https://pmd.github.io/pmd/pmd ... -
PMD、FindBug、checkstyle、sonar这些代码检查工具的区别?各自的侧重点是什么?
2017-11-28 10:01 2142可以说都是代码静态分析工具,但侧重点不同。pmd:基于源代码 ... -
阿里巴巴Java代码规约插件p3c-pmd使用指南与实现解析
2017-11-23 17:09 1602阿里巴巴Java代码规约插件安装 阿里Java代码规 ... -
静态分析工具PMD使用说明 (文章来源: Java Eye)
2017-11-23 17:07 1140质量是衡量一个软件是否成功的关键要素。而对于商业软件系统,尤 ... -
MyBatis 使用 MyCat 实现多租户的一种简单思路
2017-11-20 18:27 2836本文的多租户是基于多数据库进行实现的,数据是通过不同数据库进 ... -
Spring+MyBatis实现数据库读写分离方案
2017-11-20 17:15 1075百度关键词:spring mybatis 多数据源 读写分离 ... -
数据库连接池druid wallfilter配置
2017-11-20 11:38 1335使用缺省配置的WallFilter <be ... -
java restful 实体封装
2017-11-16 09:47 1588package com.mogoroom.bs.commo ... -
dak
2017-11-15 11:21 0package zzm; import jodd.ht ... -
Java内存模型之从JMM角度分析DCL
2017-11-15 09:35 635DCL,即Double Check Lock,中卫双重检查锁 ... -
Java 打印堆栈的几种方法
2017-11-14 09:36 4741java 中可以通过 eclipse 等工具直接打印堆栈, ... -
Servlet Session学习
2017-11-10 09:25 548HTTP 是一种"无状 ... -
浅析Cookie中的Path与domain
2017-11-10 09:26 1056Path – 路径。指定与co ... -
入分析volatile的实现原理
2017-11-08 09:47 682通过前面一章我们了解了synchronized是一个重量级的 ... -
Spring MVC-ContextLoaderListener和DispatcherServlet
2017-11-15 09:35 681Tomcat或Jetty作为Servlet ... -
搭建spring框架的时候,web.xml中的spring相关配置,可以不用配置ContextLoaderListener(即只配DispatcherServl
2017-11-07 18:27 1431搭建spring框架的时候,web.xml中的sprin ...
相关推荐
在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点并非完全对立,而是根据不同的角度来描述Java中的参数传递...
13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....
在Java编程语言中,函数参数的传递方式有两种:值传递和引用传递。理解这两种机制对于编写高效、无误的代码至关重要。以下是对这两种传递方式的详细解析。 首先,值传递是指函数调用时,实际参数的值被复制一份传给...
Java中参数传递的方式有两种理解:值传递和引用传递,但这两种说法实际上是对同一种机制的不同角度的描述。下面将详细解释这两种理解方式。 首先,我们来看值传递的理解。在Java中,当一个对象作为参数传递给方法时...
无论将Java的参数传递称为"值传递"还是"引用传递",重要的是要明白对象的引用不会改变,但对象的内容可以在方法中被修改。这种机制使得Java的代码更安全,避免了不必要的副作用,同时也提供了灵活的编程模型。
在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...
标题“Java是值传递,传对象引用也是通过值”揭示了Java中参数传递的核心概念。Java总是以值传递方式进行,这意味着当你将一个变量作为参数传递给方法时,传递的是该变量所存储值的一个副本。然而,对于对象类型的...
而在引用类型参数的引用传递中,实际参数的引用(地址)被复制给形式参数,对形参对象内容的改变将影响实际参数对象的内容。例如,在一个简单的示例程序中,我们可以看到引用类型参数的引用传递方式: public class...
62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递....
Java中传递对象时传递的并不是对象中的内容, 而是对象的地址。
- **引用传递的本质**:Java中的引用传递本质上是传递对象的引用,而不是对象本身。这意味着在方法内部对对象所做的任何改变都会影响到原始对象。 - **引用与值的区别**:与基本类型的值传递不同,引用传递不会创建...
Java 面向对象值传递和引用传递 Java 面向对象编程中,参数传递是非常重要的一个概念。参数传递有两种方式:值传递和引用传递。了解这两种方式的区别是非常重要的,因为它们对程序的执行结果产生了很大的影响。 值...
Java中,无论是值类型还是引用类型,在作为方法参数传递时,都遵循着一种被称为“按值传递”的机制。这意味着,当我们将一个变量作为参数传递给方法时,实际上传递的是该变量的一个副本。 ##### 1. 值传递 - **原理...
在值传递中,函数或方法接收的是原始数据类型(如int、double、boolean)参数的副本。例如,如果有一个方法tripleValue,它接受一个double类型的percent并尝试将它乘以3,实际上这个操作不会影响到原始的percent变量...
这里详细的说明了,java参数传递的过程,引用传递,值传递
在本文中,我们将讨论 Java 方法参数传递中的引用类型传递。 在 Java 中,引用类型包括类、接口、数组等,都是对象的引用。这些引用类型在传递过程中,会将对象的引用传递给方法体内的变量,而不是对象的副本。因此...
11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java...
在计算机编程中,值传递和引用传递是两种常见的参数传递方式。这两种传递方式在不同的编程语言中有不同的实现细节,但其核心概念是相似的。本文将详细介绍值传递和引用传递的概念、用法以及它们之间的区别,并通过...