- 浏览: 429627 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
xiesbao:
找到了,太坑爹了。
Intellij Idea 滚动条跳动的问题 -
hvang1988:
按照你说的例子,主备说的是dbtest1,dbtest2,db ...
阿里开源Mysql分布式中间件:Cobar -
hvang1988:
问个问题:一个数据库的表的全部数据只分布在一个cobar上。多 ...
阿里开源Mysql分布式中间件:Cobar -
SiKing:
多谢,一直被这个问题困扰
Intellij Idea 滚动条跳动的问题 -
guodage003:
多谢 解决了这个蛋疼的问题。。
Intellij Idea 滚动条跳动的问题
引用
在java函数中只有一种类型的返回值,但是当我们要一个函数有多个类型的返回值时,我们该怎么办呢,有办法吗,答案是肯定的,向其他语言一样使用OUT参数(就是能作为函数的输出使用的参数)。下面先看个例子,看那些参数实现了OUT功能。
/** * * 这个类是用来测试Java中如何实现OUT参数。 * * @author LoongHua * */ class B{ String cnt=null; public static void main(String[] args) { B t=new B();//实例化一个对象 String a=null; String[]s=new String[1]; B b=new B(); Object o=null; t.test1(a); System.out.println("原子类型实现的结果:"+a); t.test2(b); System.out.println("引用类型实现的结果:"+b.cnt); t.test3(s); System.out.println("数组类型实现的结果:"+s[0]); t.test4(o); System.out.println("数组类型实现的结果:"+String.valueOf(o)); } public void test1(String a){ a="aaaaaaaa"; } public void test2(B b){ b.cnt="bbbbbb"; } public void test3(String[] s){ s[0]="sssssssss"; } public void test4(Object o){ o="sssssssss"; } } 运行结果: 原子类型实现的结果:null 引用类型实现的结果:bbbbbb 数组类型实现的结果:sssssssss 数组类型实现的结果:null
引用
用Java写一个交换两个数的程序,这还不简单,下面是很容易写出的一个:
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
熟悉Java的你轻而易举的就看出了问题所在,在Java语言中,基本类型作为参数是通过传值(pass by value)的方式进行传递的,所以,这里改变的是传过来的“值”,而非我们实际的参数。
改一下我们的目标,交换两个对象,照搬上面的模式:
void swap(Object a, Object b) {
Object temp = a;
a = b;
b = temp;
}
这个方法可以正常执行吗?这是一个比较让初学者糊涂的问题。乍看之下,对象传递过来的是引用(pass by reference),改变引用的结果应该可以作用到外部。实际上,调用这个函数前后,作为实际参数的对象不会有任何改变,也就是说,这只是一个浪费时间的方法。这种pass by reference实际上也是一种pass by value,不同的是,这里的value是reference而已。所以,对传入的reference重新赋值只是对副本进行操作,而本尊没有受到任何影响。
设计方法的时候,大多数的参数是作为IN参数出现,也就是向方法传入一个值,但有时候,我们也需要参数作OUT参数——从方法内取回一个值,就像前面swap希望做的那样。如果你了解IDL(Interface Definition Language)的话,这些内容应该会让你有一丝亲切感。
在C++中,如果希望一个参数作为OUT参数,我们可能会想到指针和引用。为了让调用代码少写几个‘&’,我们可能会选择引用。
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
但到了Java中,面对这样简单的一个需求,我们却很难通过最简单的方式完成,原因上面已经说得很清楚了。难道我们只能束手就擒了吗?显然不是。虽然我们不能把引用如何,但我们仍然可以对引用指向的内容痛下狠手,于是有了这样的解决方案,提供一个对象封装类,简单起见,这里把内部成员置成了public:
class ObjectHolder {
public Object object;
}
用它改写我们的swap:
void swap(ObjectHolder a, ObjectHolder b) {
Object temp = a.object;
a.object = b.object;
b.object = temp;
}
不过调用端代码会显得复杂许多,需要把对象封装到ObjectHolder,这样执行完swap之后,ObjectHolder中所放的对象便已经是修改之后的对象。若要原有对象也受到影响,那还需要把ObjectHolder的值取出,重新给原有对象赋值。Apache的Axis就是用这种方案解决了OUT参数的问题。
Java语言从C++简化而来,一切本着简单的原则,但有些地方实在也太简单了,这样造成的结果就是有时为了完成一个简单的功能而绕很大的弯子。正是因为这样,Java语言这些年才会处于一个不断发展的过程中。也许等Java趋于完整的那一天,恐怕没有人会再以简单形容它了。
评论
4 楼
沙漠绿树
2014-08-11
yanwushu 写道
学习java也有两年了, 但是一直没有注意到参数传递的这个问题,挺惭愧的。
建议楼主在详细解释下什么叫做按值传递。不然传递object的那一段还是不容一定懂。
建议楼主在详细解释下什么叫做按值传递。不然传递object的那一段还是不容一定懂。
请看下面的代码及注释:
public class T
{
public void test(TT a, TT b)
{
TT c = a;
a = b;
b = c;
}
public void test(TT a, RR b)
{
a.a = 11;
b.b = 22;
}
public static void main(String[] args)
{
TT a = new TT();
a.a = 4;
TT b = new TT();
b.a = 6;
T t = new T();
t.test(a, b);
//这里打印的:4 6;如果不是传值引用则是:6 4
System.out.println(a.a + "\t" + b.a);
RR r = new RR();
t.test(a, r);
//这里打印:11 22;体现了out参数,a和r对象属性的值被方法改变,会影响外部使用其属性,变通的成为了out参数。
System.out.println(a.a + "\t" + r.b);
}
}
class TT
{
int a = 2;
}
class RR
{
int b = 1;
}
3 楼
yanwushu
2014-07-31
学习java也有两年了, 但是一直没有注意到参数传递的这个问题,挺惭愧的。
建议楼主在详细解释下什么叫做按值传递。不然传递object的那一段还是不容一定懂。
建议楼主在详细解释下什么叫做按值传递。不然传递object的那一段还是不容一定懂。
2 楼
avi9111
2011-10-26
写了5年程序,只是在笔试的时候会碰到这个问题
还真没碰到这种需求,要换了2个数据的
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
第一,真的没这种应用需求
第二,自己不好控制, 到底换了没,怎么判断,DEBUG?LOG?
第三,人家接手改你程序,也太难了吧,谁看的懂
还真没碰到这种需求,要换了2个数据的
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
第一,真的没这种应用需求
第二,自己不好控制, 到底换了没,怎么判断,DEBUG?LOG?
第三,人家接手改你程序,也太难了吧,谁看的懂
1 楼
lancezhcj
2010-12-04
肯钻研,而且文笔很好
发表评论
-
深入理解Java内存模型
2014-11-08 16:54 1027深入理解Java内存模型(一)——基础深入理 ... -
阿里开源Mysql分布式中间件:Cobar
2014-08-12 11:54 64462这几天研究 ... -
今日开源介绍:Google Guava、Google Guice、Joda-Time
2014-08-11 11:55 18254一、Guava 是一个 Google 的基于java1.6的 ... -
Jackson 动态过滤属性
2014-06-20 16:15 3041在把java对象转换为json时,有时需要依据需求动态过滤掉 ... -
自实现CAS原理JAVA版,模拟下单库存扣减
2014-04-02 17:47 7075在做电商系统时,库存 ... -
JAVA逻辑判断工具类
2013-09-06 21:33 1762在开发过程中,经常需要对“对象”、Map、Collecti ... -
Servlet2.4 监听器
2011-06-17 17:48 1590Servlet API提供了基本的应用程序事件监听器接口。编程 ... -
JSP页面编译成Servlet类文件过程中所涉及到的编码问题
2011-02-23 12:16 2909当请求一个JSP页面时,一般的都需要经历下面几个阶段: 1 ... -
Java中的字符集编码入门(六)Java中的增补字符
2011-02-23 12:11 1482Java号称对Unicode提 ... -
Java中的字符集编码入门(五)Java代码中的字符编码转换
2011-02-23 12:08 1160如果你是JVM的设计者,让你来决定JVM中所有字符的表 ... -
Java中的字符集编码入门(四)网页文件的编码
2011-02-23 12:03 1101接着上节的思路说,一个网页要想在浏览器中能够正确显示,需要在三 ... -
Java中的字符集编码入门(三)GB2312,GBK与中文网页
2011-02-23 12:02 1260GB2312是对中国的开发人员来说很重要的一个词汇,它的来龙去 ... -
Java中的字符集编码入门(二)编码字符集与字符集编码的区别
2011-02-23 12:01 934需要再一次强调的是, ... -
Java中的字符集编码入门(一)Unicode与UCS的历史恩怨
2011-02-23 11:59 1062ASCII及相关标准 ... -
方便管理工程中的SQL语句
2010-10-13 17:13 1852引用 之前在项目开发时候,经理要求把所有的SQL语句挑出 ... -
常见通信名称缩写解释
2010-09-03 16:05 2350引用 在看新闻时,购买手机时,经常听到关于通信方面的一 ... -
飞信维脉系统(定时短息发送系统)
2010-08-01 21:27 1601引用 因为工作原因 ... -
HTTP协议介绍
2010-07-28 09:45 825引用 HTTP(HyperTextTransferPro ... -
Java调用存储过程举例
2010-07-23 18:22 918Java调用oracle存储过程的示例总结如下。 ... -
Oracle数据库链接池
2010-04-13 17:28 2015引用 很多时候我们都要操作数据库,高效数据库操作的第一步 ...
相关推荐
总之,Java实现七参数转换功能涉及到坐标转换理论、数学运算和编程技巧,通过"SevenParamsDemo"这样的实践项目,开发者可以深入理解并应用这一技术。在实际工作中,这样的转换功能对于地理信息系统的精度和实用性至...
Java中调用存储过程主要通过JDBC(Java Database Connectivity)接口实现。以下是一步步的操作步骤: 1. **加载数据库驱动**:首先,确保已添加对应数据库的JDBC驱动库到项目类路径中,如MySQL的`mysql-connector-...
在Java编程中,多层嵌套循环...综上所述,Java实现多层嵌套循环、参数转换以及父子级结构的操作是软件开发中常见的任务,尤其在数据处理和数据库交互中。理解并熟练掌握这些技能,对于提高编程效率和代码质量至关重要。
下面我们将详细探讨Java可变参数的概念、用法以及背后的实现原理。 ### 1. 概念与语法 Java可变参数在声明时以`...`(三个点)作为后缀,它实际上是一个数组的语法糖。例如,我们可以定义一个接受任意数量整数的...
本文将详细介绍如何通过传递参数的方法实现对SQLite数据库的添加和查询操作,避免直接拼接SQL语句,从而提高代码的安全性和可读性。 首先,确保你的项目已经引入了SQLite的JDBC驱动,如`sqlite-jdbc-3.27.2.1.jar`...
在Java中,我们可以使用`java.util.Timer`类、`java.util.TimerTask`类以及Java 8引入的`java.time`包中的接口来实现时间监听功能。下面将详细介绍这些方法。 1. **使用Timer和TimerTask** `java.util.Timer`类...
### 使用Java实现Ping的多种方法 在日常网络管理和软件开发中,经常需要检查网络连通性。`ping`命令作为一种简单而有效的工具被广泛应用于这一领域。本文将介绍几种使用Java来实现`ping`功能的方法。 #### 方法一...
总之,Java实现微信企业付款到个人零钱功能涉及到微信支付平台的配置、请求参数的构造、签名算法的应用以及服务器间的通信。通过遵循微信支付的接口规范和安全策略,开发者可以安全有效地完成这一功能的集成。在实际...
本教程将详细介绍如何使用Java实现这一功能,重点是通过调用第三方工具`wkhtmltopdf`来完成这个任务。`wkhtmltopdf`是一个开源命令行工具,它利用WebKit渲染引擎将HTML页面转化为高质量的PDF文档。 首先,你需要...
RSA 加密 JAVA 实现 RSA 加密是一种非对称加密算法,由 Ron Rivest、Adi Shamir 和 Leonard Adleman 三人于 1978 年一起开发的,所以该算法也被称为 RSA 算法。该算法主要用于数据加密和数字签名,广泛应用于网络...
Java实现DBSCAN的步骤大致如下: 1. **数据预处理**:读取数据集,通常这些数据是以二维坐标形式存储,每个点由(x, y)坐标表示。可以使用`java.util.ArrayList`或`java.util.LinkedList`来存储这些点。 2. **构建...
【Java实现简单计算器】 在Java语言中实现一个简单的计算器,主要涉及到基本的算术运算符和控制流程。Java是面向对象的语言,因此我们通常会创建一个Calculator类来封装计算逻辑。下面详细介绍如何实现这个功能: ...
本文将详细解释Java如何调用Shell脚本,包括如何编写Shell脚本和在Java中如何传递参数。 首先,Shell脚本可以被看作是一系列Linux命令的集合,用于自动化执行多个命令。类似于Windows环境中的批处理文件,Shell脚本...
### Java的引用与函数参数传递详解 #### 一、Java中的引用基础 在Java中,对象的引用扮演着类似于其他编程语言(如C/C++)中指针的角色,但是Java的引用比传统的指针更加安全且易于管理。这是因为Java的设计者们...
本篇将详细介绍如何使用Java编程语言来实现与Zebra打印机进行交互,从而打印条形码。 首先,我们需要了解Zebra的通用打印机命令语言(ZPL)或EPL,这是Zebra打印机理解和执行打印任务的语言。ZPL是一种基于文本的...
本文将深入探讨Java中栈的实现以及其在实际应用中的使用。 首先,我们来理解栈的基本概念。栈是一种特殊类型的线性数据结构,其中元素的添加和删除操作(称为入栈和出栈)只在数据结构的一端进行,这一端被称为栈顶...
### Java实现短信功能详解 在IT领域,Java作为一种广泛应用的编程语言,在企业级应用、Web开发、移动设备软件开发等方面有着不可替代的地位。其中,利用Java实现短信功能是许多应用场景中的一个常见需求,例如在...
这篇博客文章“JAVA反射参数传递概略”将深入探讨如何使用反射来处理方法参数,尤其是涉及到参数传递的细节。 首先,让我们理解什么是参数传递。在Java中,有两种基本的参数传递方式:值传递和引用传递。值传递是将...
### Modbus的读写Java实现 #### 一、概述 Modbus是一种广泛应用于电子控制器之间进行数据交换的通信协议标准,常用于工业自动化系统中。它支持多种物理层传输模式,如RS-232、RS-485以及TCP/IP网络等。本文将详细...
本篇文章将深入探讨如何使用Java实现这一功能,包括导入文字和图片,并且强调了用户需要自行创建模板。 首先,Java中实现数据导入Word通常会用到Apache POI库。Apache POI是一个开源项目,提供了API来读写Microsoft...