一:
1 :如果参数是基本数据类型(四类八种:byte,short,int,long,double,float,double,boolean,char),
public class PrimitiveType {
public void change(int a) {
a = 3;
}
public static void main(String[] args) {
int a = 1;
PrimitiveType test = new PrimitiveType();
test.change(a);
System.out.println(a); // 1 ,而不是3
}
}
change 方法在被调用的时候,在内存中也分配一个空间来存储,存的是传过来的值,即3 .
而当方法结束时,这块内存就等垃圾回收了,而在main 方法中,它打印的a 的值是在调用main
方法时分配的内存空间,他们俩之间没有任何关系,所以打印的还是1.
2 : 如果参数是引用数据类型(类,数组,接口),那么传的是也是变量的值,
例如: Point param =new Point();
那么传过去的是point 这个变量的值 ,而不是说Point 这个对象!
而point 这个变量的值,其实就是Point 对象在内存中的地址(也叫引用)!
例子:
public class ReferenceType {
public void changePoint(Point point) {
point.x = 5;
point.y = 6;
}
public void changeReference(Point point) {
point = null;
}
public void testPassByStirng(String param) {
param = "newValue";
}
public static void main(String[] args) {
int a = 1;
Point point = new Point(1, 2);
ReferenceType test = new ReferenceType();
test.changePoint(point);
System.out.println(point.x); // 5 而不是 1
System.out.println(point.y); // 6 而不是 2
test.changeReference(point); // 调用这个后,下面是否会报空指针呢?
int x = point.x; // 不会
System.out.println("x 的值是 " + x );
String param = "value";
test.testPassByStirng(param);
System.out.println(param); // 是value ,而不是 newValue
}
}
class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
在java 中,访问对象是通过指向对象的引用来操作的,而一个对象可以被多个引用所指向,
无论其中哪个引用对这个对象的内容进行修改,它都会影响到另外一个引用,虽然引用有多个,但
对象却只有一个!
changePoint 方法被调用时,你把main 方法中的Point 对象的引用point 传给了changePoint的参数
point,此时,这个point 引用也指向了main 方法中的Point 对象(new 出来的),而你在这个方法中,
用point 这个引用对Point 对象(new 出来的)的内容进行了修改(point.x = 5;point.y = 6;),
因为它们指向的是同一个Point 对象(new 出来的),所以,当方法执行完后,这个修改会反映到这
个对象上,而此时,你再打印出Point 对象的x,y 的值,都是被改变后的值! 即不再是1和2,而是5与6 .
小结:
在java 中,方法参数的传递永远都是传值,而这个值,对于基本数据类型,值 就是你赋给变量的那个值,而
对于引用数据类型,这个值是对象的引用,而不是这个对象本身。
二: 在java 中,通过方法的调用,只能改变对象的内容,而不能改变对象的引用。
如 上面的方法
public void changeReference(Point point) {
point = null;
}
point = null ,这句话是把你在调用changeReference方法时,本来point 这个引用与你在main 方法中
的那个point 引用指向的是同一个对象,而当你调用point = null 时,它就不再指向原来的Point 对象
了,此时,它只是改变它自身的指向,并没有对main 方法中的point 引用进行修改,main 中的point 引用
还是指向main 中的Point 对象!所以,你在main 方法中调用 point.x; 是不会发生空指针异常的。
也就是说:在方法中,你把引用 所对应的对象的内容给改变了,它是会反应到对象上的
,这时,你再取对象的内容时,已经是你改变过了的!而无论你把传过去的引用如何
改(point = null),该引用永远指向它原来 的那个对象!
当String 做为参数传递的时候,是由于String对象本身
是不变对象所决定的! 上面的testPassByStirng 方法。
String 类型,它是不变对象,但它符合二:
当它作参数传过去时,如果对引用操作如: paramString = "改变原来的值";
这个所做的是: "改变原来的值" 其实就是String类的一个匿名对象,所以,你这样是在
方法中,重新构造一个String 对象出来,然后这个对象的引用赋给paramString ,此时,
把paramString 这个引用 给改变了,但传过来的引用并没有被改变!
分享到:
相关推荐
需要注意的是,不同类型的数据在Java和C/C++之间传递时,需要进行适当的类型转换,比如Java的`String`需要转换为C的`const char*`,而Java的`int`在C/C++中对应`jint`。此外,对于复杂数据结构的传递,可能需要使用...
Android JNI(Java Native Interface)编程是Android开发中的一个重要部分,它允许Java代码和其他语言(如C/C++)编写的代码进行交互。JNI在Android平台上扮演着桥梁的角色,使得开发者能够利用C/C++的强大性能和...
Java 实现短信发送功能主要涉及网络通信和协议处理,这里我们主要探讨如何使用Java原生API来完成这一任务。在Linux环境下,通过构建可执行的jar包,我们可以将这个功能集成到任何系统中,无需依赖特定的开发环境。 ...
Java原生接口(JNI,Java Native Interface)是Java平台提供的一种技术,允许Java代码和其他语言写的代码进行交互。JNI在1996年被引入,主要用于解决Java在某些特定场景下性能不足的问题,例如需要调用高效能的本地...
总结,Java与JNI之间的引用类型转换是Android开发中的关键技术,正确理解和应用这些转换能够确保Java和原生代码之间的无缝交互。在实际开发中,要特别注意内存管理,避免内存泄漏和异常处理,确保应用的稳定性和效率...
以上这些是JNI编程中参数传递的基础知识点。掌握这些知识对进行Android NDK开发至关重要,它有助于开发者有效地处理Java与C/C++之间的数据交换,编写出性能更优的应用程序。由于JNI编程的复杂性,开发者需要仔细阅读...
在Java与C/C++的交互中,字符串和整型是最基本的数据类型之一。下面我们将详细讨论如何在Java和C之间传递这两种类型。 1. **字符串传递**:在Java中,字符串是对象,而在C中,字符串通常表示为字符数组。在JNI中,...
总的来说,Java调用C语言编写的本地库需要理解JNI和JNA的工作原理,以及它们如何处理数据类型转换、参数传递和本地库的加载。通过这些技术,开发者可以充分利用C/C++的性能优势,同时享受Java的平台独立性和高级抽象...
本教程将深入探讨如何在Android NDK底层和Java代码之间进行数据传递和调用,具体涵盖基本数据类型、字符串以及对象的传递。 1. **Java与C/C++的数据类型映射** 在Java和C/C++之间传递数据时,首先需要了解它们之间...
5. **数据类型转换**:Java和C++的数据类型并不完全匹配,因此在两者之间传递参数时需要进行适当的转换。JNI提供了`jbyteArray`、`jintArray`等数据类型,以及`GetIntArrayElements`、`ReleaseIntArrayElements`等...
它提供了一种语言中立、平台中立的方式来描述数据结构,并提供了编译工具,可以将这些结构转换为各种编程语言的原生类型。 Protobuf的数据格式比JSON更紧凑,解析速度更快,尤其适合在网络通信中使用。 Protobuf的...
在Java和C之间传递结构体时,通常需要进行数据类型转换。比如,Java的`long`对应C的`int64_t`,Java的`boolean`对应C的`int`等。因此,需要在两端都进行相应的类型匹配和转换。 7. **错误处理和内存管理** 由于...
1. **原生数据类型**:Java中有8种原生数据类型,包括整数类型(int、long)、布尔类型(boolean)、字符类型(char)、浮点类型(float、double)以及字节类型(byte)和短整型(short)。这些类型的变量在内存中...
Java有多种数据类型,包括基本数据类型(如整数型、浮点型、字符型和布尔型)和引用数据类型(如类、接口和数组)。例如,整数型中,byte、short、int(默认类型)和long分别表示不同范围的整数。浮点型有float和...
- 编写函数实现,处理Java与C++的数据类型转换,例如`jint`、`jdouble`等是Java对应的原生类型。 3. **JNI接口定义** - 在Java类中声明`native`方法,例如: ```java public native void callDllFunction(int ...
### Java经典面试题知识点解析 #### 一、单项选择题... - **知识点**:Java中的数据类型转换。 - **解释**:Java中,并非所有的原生类型都可以任意转换。例如,布尔类型(Boolean)不能与其他数据类型进行隐式转换。
SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web服务中交换结构化和类型化的信息。在描述中提到的场景中,我们需要对SOAP消息进行加密和压缩,然后在接收端解压缩并解析,以便进一步持久化...
2. **语法基础**:包括数据类型(基本类型如int, double和引用类型如String)、变量声明、运算符、流程控制(if-else, switch, for, while循环)以及方法的定义和调用。 3. **类与对象**:理解面向对象编程的基础,...
这部分代码负责调用C# DLL,并将参数和返回值在Java与C#之间传递。 5. **Java原生接口定义**:在Java类中定义原生方法,声明为`native`关键字,并使用`JNIEXPORT`和` JNICALL`修饰符。原生方法的签名应与C/C++桥接...