public class Point{
private int x;
private int y;
public Point(int x,int y){
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
public class ParameterTest {
public void changeInt(int a){
a = 3;
}
public void changePoint(Point point){
point.setX(5);
point.setY(6);
}
public void changeString(String str){
str = "abc";
System.out.println(str);
}
public static void main(String[] args){
int a = 1;//语句(1)
ParameterTest pt = new ParameterTest();//语句(2)
pt.changeInt(a);//语句(3)
System.out.println(a);//语句(4)
Point point = new Point(1,2);//语句(5)
pt.changePoint(point);//语句(6)
System.out.println(point.getX());//语句(7)
System.out.println(point.getY());//语句(8)
String str = "xyz";//语句(9)
pt.changeString(str);//语句(10)
System.out.println(str);//语句(11)
}
}
问题1:当执行完语句(4)后,打印的结果是什么?为什么?
解答:当执行完语句(4)后,打印的结果是1。分析:首先调用定义 int a = 1;然后调用对象的changeInt(int a)方法,流程转到changeInt方法里面去,把a的值赋给了方法changeInt的形式参数,changeInt方法里面参数a的值为1,然后执行性方法体里的语句a = 3,即是将changeInt方法里面参数a的值由1改为3;注意:这个时候对方法changeInt方法里面参数a的值改变并没有影响到main方法里面的a的值,为什么?对于原生数据类型来说,它仅仅是把 main方法里面的a的值传过去,传值完后,两者之间没有任何的关系,你在changeInt方法里面对参数a的改变,对外面main方法的a没有任何的影响。因为我只是把值拷贝一份给你,拷贝完以后,你是你的我是我的,两者之间没有任何关系。因此,当执行完语句(4)后,打印结果是4。
总结:对八种原生数据类型来说,它们传递的时候传递的是它们的值(value),是值的拷贝,拷贝过去过后,你是你,我是我,两者之间无任何关系。所以,方法里面对拷贝过来的值的改变,对被拷贝的原生数据类型没有任何的影响。
问题2:当执行完语句(7)(8)后,打印的结果是什么?为什么?
解答:当执行完语句(7)(8)后,打印的结果分别是5,6。分析:语句(5)Point point = new Point(1,2),首先生成一个横坐标是1,纵坐标是2的Point对象,因为有关键字new...,point是指向刚生成的这个对象的引用,即是刚生成的对象的内存地址,接着执行语句(6),调用changePoint方法,它会把引用point传过去赋值给changePoint(Point point)里面的point.注意:传的是引用,即是对象的内存地址,接着把对象的x改为5,y改为6,这时对象的横纵坐标发生了改变,分别变为5和6。也就是说,在changePoint方法里面,对point所指向的对象的x和y的改变会反应到你外面生成的这个对象,也就是1被改成了5,2被改成了6。这个对象为什么会改变?这就涉及到 java对引用类型的传递方式上,首先语句(5)表示在内存的堆里面生成了一个Point类型的对象,point这个引用它指向堆里面生成的Point类型的对象,这个对象里x坐标是1,y坐标是2。接着去调用changePoint方法,在调用这个方法的时候,它会把point这个引用传给changePoint方法里面的point参数。在java里面,引用在java里面是对象在内存堆里面的地址,它是把对象的地址传递到了changePoint方法里面去了。地址本身也是一个int类型的值,它把地址通过参数的形式传递过去。举例:比如说new Point(1,2)这个对象在内存堆中的地址是1234,那么调用changePoint方法,它传给changePoint(Point point)里面的point的地址也是1234,changePoint方法外面的引用指向了堆里面生成的Point类型的对象,那么对changePoint方法里面的参数引用也指向同一个堆里面生成的Point类型的对象,java里面只要有两个引用它们的地址是一样的必然指向同一个对象。所以说当changePoint方法调用的时候,方法里面的引用和方法外面的引用它们指向的是同一个对象,究其原因它们是内存地址的传递,两个引用的内存地址是一样的必然指向同一个对象。通过执行changePoint方法里面的语句,把这个引用指向的对象的x改为5,y改为6。然后方法结束,结束之后,我打印changePoint方法外面这个引用它所指向对象的x坐标和y坐标,因为这两个引用指向的是同一个对象,所以结果是5和6。
问题3:当执行完语句(11)后,打印的结果是什么?为什么?
解答:当执行完语句(11)后,打印的结果是xyz。分析:语句(9) String str = "xyz";表示str这个引用指向常量"xyz"(在String Pool里面),当执行语句(10)的changeString(String str)方法时,将全局的str引用传递给changeString方法里面的str,这时会导致全局的str引用和changeString方法里面的引用会指向同一个对象"xyz",所以当完成参数传递还没有执行方法里面的语句体的时候,它们的引用是指向同一个对象"xyz"的,接着执行方法体里面的语句,这时会在String Pool里面生成一个"abc"的对象,同时将方法体里面的str指向String Pool里面的"abc"对象。一个引用在某一时刻始终只能指向一个对象,changString方法外面的str始终是指向"xyz"对象的。所以输出的时候始终是"xyz"。
总结: 在java里面,对方法的参数传递,不管是原生数据类型还是引用类型,一律是传值:
pass by value。对原生数据类型来说,传递的值就是它被赋予的那个值,比如说 int a = 3 就把3这个值传到方法里面去;引用类型来说,引用本身是一个地址,是一个int类型的内存地址值,所以说它把这个值传递到方法里面去传递的也是值。
分享到:
- 2009-02-26 21:46
- 浏览 1697
- 评论(4)
- 论坛回复 / 浏览 (4 / 3488)
- 查看更多
相关推荐
Android JNI(Java Native Interface)编程是Android开发中的一个重要部分,它允许Java代码和其他语言(如C/C++)编写的代码进行交互。JNI在Android平台上扮演着桥梁的角色,使得开发者能够利用C/C++的强大性能和...
### Java经典面试题知识点解析 #### 一、单项选择题... - **知识点**:Java中的数据类型转换。 - **解释**:Java中,并非所有的原生类型都可以任意转换。例如,布尔类型(Boolean)不能与其他数据类型进行隐式转换。
需要注意的是,不同类型的数据在Java和C/C++之间传递时,需要进行适当的类型转换,比如Java的`String`需要转换为C的`const char*`,而Java的`int`在C/C++中对应`jint`。此外,对于复杂数据结构的传递,可能需要使用...
总结,Java与JNI之间的引用类型转换是Android开发中的关键技术,正确理解和应用这些转换能够确保Java和原生代码之间的无缝交互。在实际开发中,要特别注意内存管理,避免内存泄漏和异常处理,确保应用的稳定性和效率...
Java 实现短信发送功能主要涉及网络通信和协议处理,这里我们主要探讨如何使用Java原生API来完成这一任务。在Linux环境下,通过构建可执行的jar包,我们可以将这个功能集成到任何系统中,无需依赖特定的开发环境。 ...
- Java有基本数据类型(如int, double, char, boolean)和引用数据类型(如类、接口、数组)。 - 自动类型转换:当不同数据类型的值进行运算时,系统会自动进行类型提升。 8. Scanner的使用: - Scanner类是Java...
Java有多种数据类型,包括基本数据类型(如整数型、浮点型、字符型和布尔型)和引用数据类型(如类、接口和数组)。例如,整数型中,byte、short、int(默认类型)和long分别表示不同范围的整数。浮点型有float和...
接下来,我们将详细探讨JNI中的参数传递: 1. 基本数据类型的传递 Java的基本数据类型如boolean、byte、char、int、float等,在JNI中有对应的类型:jboolean、jbyte、jchar、jint、jfloat。这些类型可以直接传递给C...
- **详细解释**: Java中的一些原生类型之间可以进行自动类型转换,如较小范围的数据类型可以自动转换为较大范围的数据类型(例如,`byte`可以自动转换为`int`)。但是,并非所有的原生类型都能相互转换,特别是布尔...
在Java与C/C++的交互中,字符串和整型是最基本的数据类型之一。下面我们将详细讨论如何在Java和C之间传递这两种类型。 1. **字符串传递**:在Java中,字符串是对象,而在C中,字符串通常表示为字符数组。在JNI中,...
20. 原生类(primitive type)的数据类型之间有特定的转换规则,并非可以任意转换。 以上就是华为笔试题中涉及的Java编程语言相关知识点的详细解析,涵盖了从基础语法到高级特性的多个层面。学习和理解这些知识点...
Java原生接口(JNI,Java Native Interface)是Java平台提供的一种技术,允许Java代码和其他语言写的代码进行交互。JNI在1996年被引入,主要用于解决Java在某些特定场景下性能不足的问题,例如需要调用高效能的本地...
总的来说,Java调用C语言编写的本地库需要理解JNI和JNA的工作原理,以及它们如何处理数据类型转换、参数传递和本地库的加载。通过这些技术,开发者可以充分利用C/C++的性能优势,同时享受Java的平台独立性和高级抽象...
1. **原生数据类型**:Java中有8种原生数据类型,包括整数类型(int、long)、布尔类型(boolean)、字符类型(char)、浮点类型(float、double)以及字节类型(byte)和短整型(short)。这些类型的变量在内存中...
- **解释**:在Java中,参数传递有两种方式:按值传递(call by value)和按引用传递(call by reference)。对于基本数据类型的参数,Java采用按值传递;对于对象的引用,Java采用按引用传递。按引用传递不会改变实际...
在IT行业中,尤其是在Web开发领域,原生AJAX(Asynchronous JavaScript and XML)和jQuery库是经常被用来创建动态交互式用户体验的技术。本篇博客主要探讨如何利用这两者实现二级联动选择,即当用户在一级选择中作出...
1. **数据类型与变量**:Java有两大类数据类型,即基本类型和引用类型。基本类型包括整型(如int)、浮点型(如float、double)、字符型(char)和布尔型(boolean)。而引用类型主要指的是类、接口和数组。理解它们...
- **答案解析**:Java中的原始数据类型(如int、double等)并非可以随意转换。虽然有些转换是自动进行的(如从short到int),但其他转换需要显式的类型转换。 ### 12. Java程序种类 - **选择题**:“Java程序的...
- **解析**:Java中的数据类型转换并非都可以任意进行。例如,`double`可以自动转换为`float`,但`float`不能自动转换为`double`,需要显式转换。 #### 概念解析 - **抽象(Abstract)** - 抽象是指在编程中关注...