- 浏览: 913822 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
学好C++,为祖国四化做贡献。
简言之:Java都是值传递(pass-by-value),而C++中包括值传递(pass-by-value)和引用传递(pass-by-reference)。
先说Java,先做几点说明:
在Java中,无非就是两种类型,即基本类型和从Object继承下来的对象类型,而对象类型又包括String这种一旦初始化就不可改变内容的类型和BufferString这种可以初始化后可
以改变内容的类型。
然后看一下代码示例:
- package test;
- public class Test {
- public static void main(String args[]) {
- Integer interger1, interger2;
- int i, j;
- interger1 = new Integer(10);
- interger2 = new Integer(50);
- i = 5;
- j = 9;
- System.out.println("Before Swap, Interger1 is " + interger1);
- System.out.println("Before Swap, Interger2 is " + interger2);
- swap(interger1, interger2);
- System.out.println("After Swap Interger1 is " + interger1);
- System.out.println("After Swap Interger2 is " + interger2);
- System.out.println("Before Swap i is " + i);
- System.out.println("Before Swap j is " + j);
- swap(i, j);
- System.out.println("After Swap i is " + i);
- System.out.println("After Swap j is " + j);
- StringBuffer sb = new StringBuffer("I am StringBuffer");
- System.out.println("Before change, sb is <" + sb + ">");
- change(sb);
- System.out.println("After change sb is <" + sb + ">");
- }
- public static void swap(Integer ia, Integer ib) {
- Integer temp = ia;
- ia = ib;
- ib = temp;
- }
- public static void swap(int li, int lj) {
- int temp = li;
- li = lj;
- lj = temp;
- }
- public static void change(StringBuffer ia) {
- ia.append(", but my content can be changed");
- //ia = new StringBuffer(",but my content can be changed");
- }
- }
输出:
Before Swap, Interger1 is 10
Before Swap, Interger2 is 50
After Swap Interger1 is 10
After Swap Interger2 is 50
Before Swap i is 5
Before Swap j is 9
After Swap i is 5
After Swap j is 9
Before change, sb is <I am StringBuffer>
After change sb is <I am StringBuffer, but my content can be changed>
这很好解释,对于基本类型诸如int,传递进去的是存放int值的“内存单元”的一个copy,所以函数swap里面的int和外面的int根本就不是一个东西,当然不能反射出去影响外面
的int。而对于对象类型,我们同样可以这样认为,传递进去的是存放对象类型的指针的“内存单元”一个copy(虽然Java里面没有指针的概念,但这并不妨碍我们理解)。这样,
在swap函数里面,对其指针本身的值做任何操作当然不会影响外面的Integer,因为interger1和interger2的“内存单元”里面的值是不变的,其指向的对象类型也是没有变的。
然后这里需要说明一个问题,就是StringBuffer这种类型的对象了。因为其内容是可以改变的,所以change函数里面的“指针”通过类似“*”的操作,改变了StringBuffer对象的
本身,就显而易见了。(StringBuffer对象本身只有一个副本)
然后说C++了,里面的基本类型的诸如int的值传递大家都了然于胸,就不在这里废话了。然后另一种值传递可以称为指针引用传递(pass-by-value argument of pointer)(这个类
似上文说的Java中的对象类型的值传递),可以通过*操作,改变指针指向的值。示例程序如下,一看便知:
- #include<iostream.h>
- int main(){
- void test(int*, const char*);
- int i = 1;
- int* iptr = &i;
- cout<<"Before pass-by-value:"<<"\n\n";
- cout<<"i = "<<i<<", It's value of i"<<endl;
- cout<<"&i = "<<&i<<", It's address of i and value of iptr"<<endl;
- cout<<"*iptr = "<<*iptr<<", It's value of i"<<endl;
- cout<<"iptr = "<<iptr<<", It's value of iptr and address of i"<<endl;
- cout<<"&iptr = "<<&iptr<<", It's address of iptr-self"<<"\n\n";
- test(iptr, "pass-by-iptr");
- test(&i, "pass-by-&i");
- return 0;
- }
- void test(int* iiptr, const char* string){
- cout<<"When pass-by-value and :"<<"\n\n";
- cout<<"*iiptr = "<<*iiptr<<", It's value of i"<<endl;
- cout<<"iiptr = "<<iiptr<<", It's value of iiptr and address of i"<<endl;
- cout<<"&iiptr = "<<&iiptr<<", It's address of iiptr-self, different with iptr!"<<"\n\n";
- }
输出:
Before pass-by-value:
i = 1, It's value of i
&i = 0x0012FF7C, It's address of i and value of iptr
*iptr = 1, It's value of i
iptr = 0x0012FF7C, It's value of iptr and address of i
&iptr = 0x0012FF78, It's address of iptr-self
When pass-by-value and :
*iiptr = 1, It's value of i
iiptr = 0x0012FF7C, It's value of iiptr and address of i
&iiptr = 0x0012FF24, It's address of iiptr-self, different with iptr!
When pass-by-value and :
*iiptr = 1, It's value of i
iiptr = 0x0012FF7C, It's value of iiptr and address of i
&iiptr = 0x0012FF24, It's address of iiptr-self, different with iptr!
在C++里面的第二种就是引用传递了(pass-by-reference)。见如下示例:
- #include<iostream.h>
- int main(){
- void test(int&, const char*);
- int i = 1;
- int &iref = i;
- cout<<"Before pass-by-reference:"<<"\n\n";
- cout<<"i = "<<i<<", It's value of i"<<endl;
- cout<<"&i = "<<&i<<", It's address of i and value of iptr"<<endl;
- cout<<"iref = "<<iref<<", It's value of iref and value of i"<<endl;
- cout<<"&iref = "<<&iref<<", It's address of iref-self, the same as i!"<<"\n\n";
- test(iref, "pass-by-iref");
- test(i, "pass-by-i");
- return 0;
- }
- void test(int &iiref, const char* string){
- cout<<"When pass-by-reference and "<<string<<"\n\n";
- cout<<"iiref = "<<iiref<<", It's value of iiref and value of i"<<endl;
- cout<<"&iiref = "<<&iiref<<", It's address of iiref-self, the same as i!"<<"\n\n";
- }
输出:
Before pass-by-reference:
i = 1, It's value of i
&i = 0x0012FF7C, It's address of i and value of iptr
iref = 1, It's value of iref and value of i
&iref = 0x0012FF7C, It's address of iref-self, the same as i!
When pass-by-reference and pass-by-iref
iiref = 1, It's value of iiref and value of i
&iiref = 0x0012FF7C, It's address of iiref-self, the same as i!
When pass-by-reference and pass-by-i
iiref = 1, It's value of iiref and value of i
&iiref = 0x0012FF7C, It's address of iiref-self, the same as i!
这里的引用(reference)说的明白一些,就是被传递参数的一个别名,或者更直接的理解就是被传递参数自己了,只是名字不同而已。那么既然自己都被pass过去了,那当然可以在function里面为所欲为了。赫赫。
renki_z对本文亦有贡献
发表评论
-
maven 在Mac OS下运行的问题总结
2014-05-16 17:24 820在maven下生成基本的项目结构。 生成eclipse项 ... -
【zz】 java函数参数类型后添加三点的用法
2012-07-02 09:48 1043今天看到一个没见过的函数参数列表test(int... a), ... -
【zz】Java编码的理解和Java加载器的理解
2012-06-08 15:59 745一,我对java中编码的理解1. 编码的产生 对电脑而言 ... -
类加载器入门级应用
2012-06-08 15:17 9211、类加载器负责加载 Ja ... -
ClassLoader详解
2012-06-08 14:23 1238Point One 将J2EE应用程序移植到W ... -
Java静态代理与动态代理
2012-05-29 10:32 934JAVA的静态代理与动态代 ... -
JDK的动态代理深入解析(Proxy,InvocationHandler)(转)
2012-05-29 10:31 5179调用处理器InvocationHandle ... -
zz 动态反射实现AOP的简单原理
2012-05-28 17:46 893其实AOP的意思就是面向切面编程. OO注重的是我们 ... -
理解Java枚举在单例模式的应用
2012-06-05 15:50 12685.3.9 单例和枚举 按照《高效Java 第二版》中的说 ... -
Java 枚举的介绍
2012-05-23 16:50 0一、使用简单程序完成枚举的功能 例:使用简单类完成枚举操作 ... -
枚举类型的用法
2012-06-05 15:50 1425DK1.5引入了新的类型——枚举。在 Java 中它虽然算 ... -
单例模式的七种写法 (包括1.5新特性)
2012-05-23 16:18 0第一种(懒汉,线程不安全): <!--<br / ... -
重写hashCode方法的意义
2012-05-23 16:01 1636Java中的很多对象都override了equ ... -
JDK Log的设计思想
2012-05-23 14:39 1305最近在看《Agile Java》,看到日志一节,收获颇多,所以 ... -
[zz] Synchronized和Static Synchronized区别
2012-05-23 14:07 775通过分析这两个用法的分析,我们可以理解java中锁的概念。一 ... -
双精度、单精度的有效位数
2012-05-22 17:25 5094浮点数7位有效数字。(应该是单精度数) 双精度数16位有效 ... -
DecimalFormat 使用方法
2012-05-22 16:44 1019我们经常要将数字进行格式化,比如取2位小数,这是最常见的。Ja ... -
Java Applet 无法运行的一个问题
2012-04-28 15:09 2526当你用JDK1.6开发出的新功能,在JDK1.6上re ... -
JDK1.5之中的Map相关的类
2012-04-26 10:14 1856java5的java.util包提供了大量集合类。其中最常用的 ... -
设计模式应用场景总结
2012-04-11 16:47 1260在J2EE的开发和测试中,其实不知不觉已经使用了许多设计模式。 ...
相关推荐
C和C++中的函数参数传递方式主要分为值传递、指针传递和引用传递。这些方式决定了参数在函数调用时的传值行为,以及它们在函数执行后是否能够影响原始数据。下面详细解释这些传递方式的知识点。 1. 值传递(Call by...
### Java的引用与函数参数传递详解 #### 一、Java中的引用基础 在Java中,对象的引用扮演着类似于其他编程语言(如C/C++)中指针的角色,但是Java的引用比传统的指针更加安全且易于管理。这是因为Java的设计者们...
#### C与Java中的参数传递对比 虽然Java和C/C++都支持按值传递,但它们之间的处理方式有所不同。Java中无论是基本类型还是对象引用,都是按值传递的。但是,当传递的是对象引用时,传递的是引用的副本,这使得函数...
在JNI中,我们可以使用C++或C语言编写本地方法,这些本地方法可以直接访问和操作Java对象,包括传递参数和接收返回值。在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java...
在Java编程语言中,函数参数传递机制是一个关键概念,它涉及到如何在方法内部操作传入的参数。根据Java的特性,参数传递分为两种主要类型:值传递和引用传递。下面我们将详细探讨这两种传递方式以及它们在不同数据...
本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用传递以及C++中的指针传递,并通过具体的代码示例来帮助理解这些概念。 #### 值传递 值传递是最简单的参数传递方式之一,它指...
在跨平台的软件开发中,有时我们需要...这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种语言之间传递参数和返回值。熟练掌握JNI可以极大地扩展Java应用的功能,尤其是在需要高性能计算或利用硬件特性时。
它提供了一个简洁的方式来定义C/C++函数原型,并将其映射到Java方法上。例如,如果你有一个C++函数接收二维数组并返回二维数组,你可以这样在Java中定义: ```java public interface MyDLL extends Library { // ...
值传递与Java类似,只是C++允许对基本数据类型进行直接复制。引用传递类似于Java中的引用,但它不像Java那样创建引用副本,而是直接提供原始对象的别名。这意味着对引用参数的任何修改都会影响原始对象,如`ByRef`...
这种通信包括但不限于调用C++函数,传递数据,以及执行回调等。 在性能方面,JNI允许直接访问硬件,从而在需要高效计算或低级别操作的场合提供显著优势。然而,使用JNI也有其挑战,比如内存管理、线程同步和异常...
JNI(Java Native Interface)是Java平台标准的一部分,它提供了一种机制,使得Java代码能够调用C/C++函数,同时C/C++代码也能调用Java的方法。在Android开发中,JNI和NDK(Native Development Kit)的结合使用尤其...
标题中的“Java和C++通信结构体发送”指的是在Java和C++这两种不同的编程语言之间,通过网络进行通信时如何有效地传递结构体数据的问题。在跨语言通信中,由于二进制序列化和内存布局的差异,直接传输结构体会面临...
总结来说,Qt平台上的C++与Java代码交互涉及到JNI接口的使用,包括C++函数的声明、Java方法的调用、动态库的加载以及在Qt项目中的整合。熟练掌握这些技巧,将有助于开发跨语言的复杂应用程序。在实践中,应不断学习...
这个`DLL`可能包含了用于与ActiveMQ交互的函数,使得Java代码能够通过这个接口与C++的`Consumer`进行通信。`dll3`很可能就是这个实现具体功能的动态链接库文件。 ActiveMQ在Java和C++之间的通信中扮演了关键角色。...
知识点四:函数、数组、字符串与参数传递。书中讲解了C++中的函数定义与调用、函数重载、默认参数、内联函数和单独编译。同时对数组和字符串的使用、多维数组以及引用与常量引用的参数传递进行了详细说明。 知识点...
这种交互可以是Java调用C/C++函数,也可以是C/C++调用Java的方法。JNI为开发者提供了一种灵活的方式,使得Java应用程序能够利用已有的C/C++库,或者在必要时执行高性能的原生代码。 1. **JNI基本结构**:JNI的核心...
// 实现C++函数逻辑 } ``` 步骤四:编译和链接 1. 链接生成的C++源代码和DLL库,确保所有依赖项都已解决。 2. 编译为DLL文件,通常命名为`myDll.dll`。 步骤五:在Java中调用 1. 在Java程序中,通过`System....
这将生成一个`JniWrapper.h`文件,里面包含类似以下的C++函数原型: ```cpp #include JNIEXPORT void JNICALL Java_JniWrapper_callCppMethod(JNIEnv *, jobject); ``` 然后,我们在C++中实现这个方法。为了调用...
本项目实现了一个基于Socket的文件传输方案,其中Java作为服务端,C++作为客户端,使得Windows环境下的文件能够在两个程序之间安全、高效地传递。以下是对这个程序设计和实现的关键知识点的详细说明: 1. **Java ...
在编程领域,参数传递是我们在编写函数或方法时必须了解的基本概念。本文将对"参数传递的总结——构造函数"这一主题进行详细阐述,主要关注如何在构造函数中有效地管理和传递参数。 首先,让我们理解什么是参数传递...