`
windywindy
  • 浏览: 170360 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java中的原生数据类型和引用类型的参数传递

阅读更多
一:

    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 这个引用 给改变了,但传过来的引用并没有被改变!
分享到:
评论

相关推荐

    androidNDK编程java传递参数到c

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

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

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

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

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

    Java原生接口.pdf

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

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

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

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

    以上这些是JNI编程中参数传递的基础知识点。掌握这些知识对进行Android NDK开发至关重要,它有助于开发者有效地处理Java与C/C++之间的数据交换,编写出性能更优的应用程序。由于JNI编程的复杂性,开发者需要仔细阅读...

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

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

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

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

    Android NDK底层和java代码相互传值调用(实用经典Demo)

    本教程将深入探讨如何在Android NDK底层和Java代码之间进行数据传递和调用,具体涵盖基本数据类型、字符串以及对象的传递。 1. **Java与C/C++的数据类型映射** 在Java和C/C++之间传递数据时,首先需要了解它们之间...

    Java和c++相互调用javalearnsa资料分享

    5. **数据类型转换**:Java和C++的数据类型并不完全匹配,因此在两者之间传递参数时需要进行适当的转换。JNI提供了`jbyteArray`、`jintArray`等数据类型,以及`GetIntArrayElements`、`ReleaseIntArrayElements`等...

    Netty中集成Protobuf实现Java对象数据传递示例代码.rar

    它提供了一种语言中立、平台中立的方式来描述数据结构,并提供了编译工具,可以将这些结构转换为各种编程语言的原生类型。 Protobuf的数据格式比JSON更紧凑,解析速度更快,尤其适合在网络通信中使用。 Protobuf的...

    使用java和C语言进行通信 并且使用结构体传输的代码实例 包含三个示例

    在Java和C之间传递结构体时,通常需要进行数据类型转换。比如,Java的`long`对应C的`int64_t`,Java的`boolean`对应C的`int`等。因此,需要在两端都进行相应的类型匹配和转换。 7. **错误处理和内存管理** 由于...

    Java基础学习笔记

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

    java(2).doc

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

    java与dll的交互

    - 编写函数实现,处理Java与C++的数据类型转换,例如`jint`、`jdouble`等是Java对应的原生类型。 3. **JNI接口定义** - 在Java类中声明`native`方法,例如: ```java public native void callDllFunction(int ...

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

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

    java中重写ZipCOM方法

    SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web服务中交换结构化和类型化的信息。在描述中提到的场景中,我们需要对SOAP消息进行加密和压缩,然后在接收端解压缩并解析,以便进一步持久化...

    java-ppt.rar_java .ppt_java ppt_java基础 ppt_java基础 ppt_ppt jav

    2. **语法基础**:包括数据类型(基本类型如int, double和引用类型如String)、变量声明、运算符、流程控制(if-else, switch, for, while循环)以及方法的定义和调用。 3. **类与对象**:理解面向对象编程的基础,...

    JavaInvokeCS-master_JAVA调用C#dll_fightsk4_C#_

    这部分代码负责调用C# DLL,并将参数和返回值在Java与C#之间传递。 5. **Java原生接口定义**:在Java类中定义原生方法,声明为`native`关键字,并使用`JNIEXPORT`和` JNICALL`修饰符。原生方法的签名应与C/C++桥接...

Global site tag (gtag.js) - Google Analytics