`
L.G.Alexander
  • 浏览: 158146 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(二): Java中的原生数据类型和引用类型的参数传递

阅读更多
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类型的内存地址值,所以说它把这个值传递到方法里面去传递的也是值。
分享到:
评论
4 楼 Wuaner 2010-01-12  
楼主的文章都总结的非常好!非常感谢。
转载几篇到我空间中;当然了,出处是一定会标名的,呵呵。。。


提一个小意见:问题一的解答里,出现前后矛盾了!应该是手误吧。。。

3 楼 L.G.Alexander 2009-02-28  

上面说“
你一定觉得是传对象时就成了传引用了?对象没有值,所以传引用。(不知道说得对不对。) ”这个说法不对,java里面没有传引用这一说,java里面一律是PASS BY VALUE,在C++里面才有传引用,这点要注意java和C++的传值区别,不要搞混淆了!
在java中你只要记住一句话PASS BY VALUE,一切参数传递都适用!
2 楼 phenom 2009-02-28  
简单的说就是后面总结的一句,PASS BY VALUE。通过值传递。
你一定觉得是传对象时就成了传引用了?对象没有值,所以传引用。(不知道说得对不对。)
传对象是传它 “引用的值”,也就是上面的point,引用的值就是内存地址了,LZ说了也是一个INT值。而不是对象的状态,point(1,2),在changPoint里改变值时是改变了”point这个引用“指向的对象的值。这里的point引用,是从外面传进来的,所以这里变了值,外面也变了。
1 楼 zhangyj 2009-02-27  
问题2:当执行完语句(7)(8)后,打印的结果是什么?为什么?
还是有点乱!

相关推荐

    androidjni编程,java和c层的互相通信传递数据

    Android JNI(Java Native Interface)编程是Android开发中的一个重要部分,它允许Java代码和其他语言(如C/C++)编写的代码进行交互。JNI在Android平台上扮演着桥梁的角色,使得开发者能够利用C/C++的强大性能和...

    Java经典面试题大全(带答案)

    ### Java经典面试题知识点解析 #### 一、单项选择题... - **知识点**:Java中的数据类型转换。 - **解释**:Java中,并非所有的原生类型都可以任意转换。例如,布尔类型(Boolean)不能与其他数据类型进行隐式转换。

    androidNDK编程java传递参数到c

    需要注意的是,不同类型的数据在Java和C/C++之间传递时,需要进行适当的类型转换,比如Java的`String`需要转换为C的`const char*`,而Java的`int`在C/C++中对应`jint`。此外,对于复杂数据结构的传递,可能需要使用...

    Android Java代码与JNI交互 引用类型转换(五)

    总结,Java与JNI之间的引用类型转换是Android开发中的关键技术,正确理解和应用这些转换能够确保Java和原生代码之间的无缝交互。在实际开发中,要特别注意内存管理,避免内存泄漏和异常处理,确保应用的稳定性和效率...

    java实现短信发送功能(java原生API实现)

    Java 实现短信发送功能主要涉及网络通信和协议处理,这里我们主要探讨如何使用Java原生API来完成这一任务。在Linux环境下,通过构建可执行的jar包,我们可以将这个功能集成到任何系统中,无需依赖特定的开发环境。 ...

    java基础知识.docx

    - Java有基本数据类型(如int, double, char, boolean)和引用数据类型(如类、接口、数组)。 - 自动类型转换:当不同数据类型的值进行运算时,系统会自动进行类型提升。 8. Scanner的使用: - Scanner类是Java...

    java(2).doc

    Java有多种数据类型,包括基本数据类型(如整数型、浮点型、字符型和布尔型)和引用数据类型(如类、接口和数组)。例如,整数型中,byte、short、int(默认类型)和long分别表示不同范围的整数。浮点型有float和...

    浅析Android NDK编程中参数的传递.pdf

    接下来,我们将详细探讨JNI中的参数传递: 1. 基本数据类型的传递 Java的基本数据类型如boolean、byte、char、int、float等,在JNI中有对应的类型:jboolean、jbyte、jchar、jint、jfloat。这些类型可以直接传递给C...

    华为Java笔试题.pdf

    - **详细解释**: Java中的一些原生类型之间可以进行自动类型转换,如较小范围的数据类型可以自动转换为较大范围的数据类型(例如,`byte`可以自动转换为`int`)。但是,并非所有的原生类型都能相互转换,特别是布尔...

    java与c交互传递字符串和整型

    在Java与C/C++的交互中,字符串和整型是最基本的数据类型之一。下面我们将详细讨论如何在Java和C之间传递这两种类型。 1. **字符串传递**:在Java中,字符串是对象,而在C中,字符串通常表示为字符数组。在JNI中,...

    华为笔试题:JAVA.pdf

    20. 原生类(primitive type)的数据类型之间有特定的转换规则,并非可以任意转换。 以上就是华为笔试题中涉及的Java编程语言相关知识点的详细解析,涵盖了从基础语法到高级特性的多个层面。学习和理解这些知识点...

    Java原生接口.pdf

    Java原生接口(JNI,Java Native Interface)是Java平台提供的一种技术,允许Java代码和其他语言写的代码进行交互。JNI在1996年被引入,主要用于解决Java在某些特定场景下性能不足的问题,例如需要调用高效能的本地...

    java调用C语言编写的so库中的函数,java调用C语言编写的dll库中的函数

    总的来说,Java调用C语言编写的本地库需要理解JNI和JNA的工作原理,以及它们如何处理数据类型转换、参数传递和本地库的加载。通过这些技术,开发者可以充分利用C/C++的性能优势,同时享受Java的平台独立性和高级抽象...

    Java基础学习笔记

    1. **原生数据类型**:Java中有8种原生数据类型,包括整数类型(int、long)、布尔类型(boolean)、字符类型(char)、浮点类型(float、double)以及字节类型(byte)和短整型(short)。这些类型的变量在内存中...

    华为java面试题

    - **解释**:在Java中,参数传递有两种方式:按值传递(call by value)和按引用传递(call by reference)。对于基本数据类型的参数,Java采用按值传递;对于对象的引用,Java采用按引用传递。按引用传递不会改变实际...

    原生AJAX或jQuery实现二级联动选择以及解析XML和JSON数据格式

    在IT行业中,尤其是在Web开发领域,原生AJAX(Asynchronous JavaScript and XML)和jQuery库是经常被用来创建动态交互式用户体验的技术。本篇博客主要探讨如何利用这两者实现二级联动选择,即当用户在一级选择中作出...

    thinging in java4的习题答案

    1. **数据类型与变量**:Java有两大类数据类型,即基本类型和引用类型。基本类型包括整型(如int)、浮点型(如float、double)、字符型(char)和布尔型(boolean)。而引用类型主要指的是类、接口和数组。理解它们...

    2015年腾讯Java工程师笔试题

    - **答案解析**:Java中的原始数据类型(如int、double等)并非可以随意转换。虽然有些转换是自动进行的(如从short到int),但其他转换需要显式的类型转换。 ### 12. Java程序种类 - **选择题**:“Java程序的...

    java面试题

    - **解析**:Java中的数据类型转换并非都可以任意进行。例如,`double`可以自动转换为`float`,但`float`不能自动转换为`double`,需要显式转换。 #### 概念解析 - **抽象(Abstract)** - 抽象是指在编程中关注...

Global site tag (gtag.js) - Google Analytics