1.
引用和对象的区分
在java
中,一切皆对象,而我们就是通过引用来操作对象。换句话说,java
的存储中,new
出来的对象存储在堆中,创建的引用则一般存储在栈中,像C
中的指针一样指到某一对象(或者null
)。
![](http://dl.iteye.com/upload/picture/pic/50071/bfd4ed54-f1d6-36a9-b7c8-08dbad9cda1f.jpg)
我认为这里有个误解,大多数的教材都在这个地方对引用长篇大论,搞得这里貌似很神秘,其实,如果看过计算机体系方面的书,就会对关于引用有个正确的理解。
一般来说,参数的传递实际就是将实际参数复制栈中的。参数为基本类型传递的是具体的数值,参数为对象传递的是对象引用(指向该对象的“指针”)。这是因为在栈中,基本类型存储的是数值,对象存储的是对象的引用。
先看一个程序
package test;
public class Test {
public static void main(String args[]) {
Value v = new Value(10);
Reference.referenceValue(v.value);
System.out.println(v.value);
System.out.println();
Value v1 = new Value(10);
Reference.referenceObject(v1);
System.out.println(v1.value);
System.out.println();
Value v2 = new Value(10);
Reference.test(v2);
System.out.println(v2);
}
}
class Value {
int value;
Value(int value) {
this.value = value;
}
}
class Reference {
static void referenceValue(int i) {
System.out.println("基本类型");
i++;
System.out.println(i);
}
static void referenceObject(Value v) {
System.out.println("对象");
v.value++;
System.out.println(v.value);
}
static void test(Value v) {
System.out.println("测试");
v = null;
System.out.println(v);
}
}
执行结果如下:
基本类型
11
10
对象
11
11
测试
null
test.Value@1fb8ee3
Reference
类中的referenceValue
方法接受的参数为int
型,传递的是数值,如下图
![](http://dl.iteye.com/upload/picture/pic/50067/fd98276c-1aeb-3ba8-9549-ec20c0ca93a0.jpg)
referenceValue
方法中所操作的i
,实际上已经是内存中的另一部分,原来的Value
对象中的value
值根本没有变。
referenceValue
方法接受的参数为Value
对象,实际传递过来的是Value
对象的引用,如下图
![](http://dl.iteye.com/upload/picture/pic/50063/b914bfa0-b3f0-307a-8409-211b9ddf7926.jpg)
referenceValue
方法接收的参数对象Value,
实际是对象的引用,及把v1
复制给v
,使两个引用都指向堆中的同一个对象内存new Value(10)
,可以通过显示v
和v1
的hashCode
,可以发现相同。
Test
方法也是接收Value
对象的引用,如下图
![](http://dl.iteye.com/upload/picture/pic/50069/4984baa2-bff4-3019-8bf5-8c196eea80cd.jpg)
虽然在test
方法中把Value
对象的引用v
指向null
,但是原来的引用v2
还是指到堆中的new Value(10)
。
3.
总结
所有的参数传递不过是在程序运行栈上新分配一个值的复制品。
分享到:
- 2009-11-23 20:32
- 浏览 957
- 评论(1)
- 论坛回复 / 浏览 (1 / 1484)
- 查看更多
相关推荐
Java 方法参数传递是 Java 编程语言中的一种基本机制,在方法调用时将参数传递给方法体内的变量,但是在传递过程中,参数的类型会对传递结果产生影响。在本文中,我们将讨论 Java 方法参数传递中的引用类型传递。 ...
Java参数传递机制是编程中的重要概念,尤其是在Java中,它对于理解如何在方法间操作数据至关重要。本PPT深入探讨了这一主题,旨在帮助学习者彻底理解Java中的参数传递方式。 首先,我们要回顾面向对象的基本概念。...
Java参数传递机制是编程中非常重要的概念,它涉及到基本类型和引用类型的差异。在Java中,参数传递主要有两种方式:值传递(Value Passing)和引用传递(Reference Passing)。虽然Java官方文档并未明确提及引用传递...
总结来说,JNI中的参数传递涉及以下步骤: 1. 在Java中定义与C++结构体匹配的类。 2. 使用`javah`生成C/C++头文件。 3. 在C++中实现本地方法,注意使用正确的JNI类型和函数来处理参数和返回值。 4. 转换C++数据类型...
总结一下,JNI 参数传递的关键点包括: 1. **类型映射**:Java 和 C++ 的数据类型不同,需要使用 JNI 提供的类型映射,如 `jint`、`jstring` 等。 2. **字段访问**:使用 JNI 的 `GetFieldID` 和 `GetObjectField`...
Java 中的参数传递机制,可以简单地总结为:基本类型作为参数传递时,是传递值的拷贝;对象作为参数传递时,是传递对象的引用。如果你在方法内改变了对象的值,那么原对象也跟着改变,但是如果你重新分配了对象的...
通过上述分析,我们可以清楚地了解到Java中引用和函数参数传递的基本概念以及它们的具体应用。了解这些概念对于正确使用Java进行编程非常重要,尤其是在处理复杂的数据结构和对象交互时。希望本文能帮助读者更好地...
总结来说,Java中的参数传递分为值传递(基本类型)和引用传递(对象)。值传递不会改变原始变量,而引用传递会根据对象是否可变来决定是否影响原始对象。在处理String对象时,虽然看起来像是引用传递,但由于String...
根据题目要求,我们将详细解析如何使用Java Applet来接收HTML文件中的参数,并计算矩形的面积与周长,最后将结果展示在...但理解Java Applet的基本原理仍然有助于我们更好地理解和学习软件工程中的参数传递等概念。
### JNI中C和Java参数传递详解 #### 一、引言 Java Native Interface (JNI) 是Java平台标准的一部分,用于让Java代码与其他语言写的代码进行交互。本文将深入探讨在JNI环境中,C/C++和Java之间如何进行参数传递,...
### 关于Java中的传递方式详解 #### 一、引言 在Java编程中,了解数据是如何在函数间传递的是至关重要的。这对于理解程序的行为、调试以及优化代码都非常关键。Java支持两种基本的数据传递方式:值传递和引用传递...
总结,Java中的参数传递看似复杂,实则可以通过理解对象和引用的工作机制来简化。虽然Java不直接支持按引用传递,但通过对象的引用机制,我们可以实现类似的效果。对于初学者来说,明确这一点可以帮助避免很多关于...
总结起来,Java中的参数传递机制遵循以下规则: 1. **基本数据类型**:按值传递,传递的是变量值的副本,方法内部的修改不会影响到原始变量。 2. **对象类型**:按值传递,传递的是对象引用的副本,方法内部对对象...
总结一下,Java中函数参数传递的关键点: - 基本数据类型(包括其包装类)按值传递,函数内部修改不会影响原始变量。 - 对象(包括数组)按引用传递,函数内部对对象的修改会影响到原始对象。 - String对象虽然是...
总结来说,Java中的参数传递主要有以下特点: 1. 基本数据类型按值传递,函数内部无法改变实际参数的值。 2. 引用类型看似按引用传递,实际上传递的是对象引用的副本,因此函数可以影响实际对象的值。 3. `String`...
总结,JNI参数传递涉及基本类型、自定义对象和系统对象。理解和熟练掌握这些技术对于深入Android开发和优化性能至关重要。在实际应用中,应特别注意内存管理和对象生命周期,以确保代码的稳定性和效率。通过实践和...
本资源“wxh java中传递数组参数.rar”包含了关于这个主题的详细信息,特别是文档“java中传递数组参数.doc”。下面我们将深入探讨Java中如何有效地传递数组参数。 一、数组的概念 在Java中,数组是一种特殊的对象...
Java参数传递机制是一个经常引起讨论的话题,尤其是在初学者和经验丰富的开发者之间。Java中参数传递的基本原则可以总结为:对于所有类型的参数,Java总是进行值传递。然而,对于基本类型和对象引用,"值传递"的概念...
本教程将详细介绍如何在Android中通过Java语句与HTML中的JavaScript进行互调,并传递参数。 首先,我们需要在Android项目中引入`WebView`组件。在XML布局文件中添加一个`WebView`: ```xml android:id="@+id/...