java关于传值与传引用

摘要:
java价值转移或参考转移的问题经常出现在一些烦人的面试问题中,主要是为了检查个人对java基础知识的掌握情况。但是,如果远程调用该方法,则对象本身将传递给Java。Java是本地编程,其中大多数是值传递。该值包括基本值和参考值,分别对应于基本类型和参考类型。虽然引用类型是值传递,但它显示了引用传递的效果。当obj作为参数传递时,引用值被传递给另一个引用obj1。此时,obj1指向堆中的对象object。

关于java传值还是传引用的问题经常出现在一些烦人的面试题中,主要考察个人对java基础的掌握情况。

首先明确一下:本地方法中,java的参数传递都是传值。但是如果是远程调用方法时,会将对象本身传递过去

Java是本地编程多是传值,这个值包括基本值和引用值,分别对应基本类型和引用类型。基本类型就不说了。

引用类型虽然是传值,但是却表现出传引用的效果。传递过去的对象如果被改变,也会导致调用对象中值变化。

因此,编写库文件时要遵循一点:不要去改变传入值,使用内部对象接收内容,然后对内部对象进行操作在返回结果。

先看一下Object obj = new Object();过程中栈和堆中做了哪些事情。

反编译出来内容如下

    Code:
       0: new           #2                  // class java/lang/Object
       3: dup
       4: invokespecial #1                  // Method java/lang/Object."<init>":()V
       7: astore_1

new:创建一个Object对象并将其引用进栈

dup:复制栈顶值

invokespecial:执行Object对象的构造函数进行初始化

astore:将复制的栈顶值赋值给obj中,并将栈顶值出栈

从上可知,obj中存放着Object对象的引用,为引用值。

当obj作为参数传递时将引用值传递给另外一个引用obj1,此时obj1 就指向了堆中的对象Object。

此时看起来像是传递了引用过去,实际上是专递了obj中的Object对象引用的值.

但是如果直接对obj1进行操作的话,也就等于在操作obj引用的对象,导致obj引用内容的改变。

特别的,关于空引用null,null可以是任何引用类型的特殊值,但是基本类型不可以为null

免责声明:文章转载自《java关于传值与传引用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇构建伪Update服务器工具isr-evilgradejs 用blob来显示存储资源,并清除其他资源下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java list按照元素对象的指定多个字段属性进行排序

ListUtils.java---功能类 package com.enable.common.utils;import java.lang.reflect.Field;import java.text.NumberFormat;import java.util.Collections;import java.util.Comparator;import j...

javabean与map互转

/*** 将一个 JavaBean 对象转化为一个 Map* @param bean 要转化的JavaBean 对象* @return 转化出来的 Map 对象* @throws Exception */ public static Map convertBean(Object bean){Map returnMap = new HashMap(); if...

C#速成之二(Quick C#)

------------------- 数据类型 ------------------- 所有C#数据类型都派生自基类Object。这里有两类数据类型: 基本型/内置型 用户自定义型 下面一个C#内置类型列表: 类型字节数解释 byte 1 无符号字节型 sbyte 1 有符号字节型 short 2 有符号短字节型 ushort 2 无符号短字节型 in...

python嵌入C++ boost.python如何在C++中调用含有不定长参数tuple变量和关键字参数dict变量的函数

    这个问题是在我尝试利用pygraphviz嵌入我的C++代码绘制二叉树的时候发现的.找了半天资料,这里我把几种常用的C++调用 PYTHON利用 boost.python 的方法作一个总结,希望能让别人少走弯路,因为有些内容还找不到中文文档,虽然都不难但是开始摸索 还是费时间的.     我个人认为boost.python真的是非常的COOL,基...

Springboot整合AOP

AOP:Spring得核心之一,面向切面编程,底层是通过动态代理实现得。实现方式有两种:(1)基本JDK原生动态代理,被代理得类需要实现接口。  (2)基于CGLIB,类和接口都可以代理。 在没有使用boot框架时,使用ssm时,我们需要在配置文件中加上以下配置。    (1)配置切入点。 (2)编写切面类。  (3)将配置类与切入点结合。        ...

过滤驱动加密文件(代码)

转载自http://www.misssir.cn/art/_show.aspx?art=49 摘要:     我想做一个unlocker一样的程序,不管这个文件有没有被使用,先实现删除它。在查资料过程中,就知道了如果不访问磁盘扇区的话,除非写驱动才能做到。奈何时间有限,工作匆忙,一直没有完成。而且忽视了更简便的方法——在别的路径下把修改后的OCX控件重...