`
Brucegaochina
  • 浏览: 40648 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java参数传递(一)

阅读更多
江湖人称:java中是值传递方式而非引用传递,即所谓的:“传值”;那么在当参数是对象的时候不是传递引用吗,java中对象的引用是指对象的地址,它也是一个整形值,即 “传址”,所以归根揭底java中的参数都是值传递

1,基本类型作为参数传递
请看实例代码:

public class RawType {

	public static void main(String[] args) {
		int i = 2000;
		int j = 5000;
		
		changInt(i,j);
		System.out.println(i+" "+j);

	}

	private static void changInt(int a, int b) {
		a = 1000;
		b = 8000;
	}

}


打印结果: 2000 5000
分析:java中八种基本类型作为参数时,传递的都是基本类型的值拷贝,即当调用方法changInt(int a, int b)时,在传递给方法的是i,j的一个内存拷贝,而并非真正的i,j自己,打印结果就是最好的证明.
这时在栈内存中开辟了临时的i,j的拷贝a,b,方法里面重新给拷贝赋值了,拷贝(a,b)自然是变了,但是i,j自己并没有因为方法调用而变化.
当方法调用结束时后,a,b自动销毁,因为在栈中其销毁不需要java虚拟机去回收的,自己销毁(表现出来的就是方法外a,b不能访问).


图 1-1


2,引用类型作为参数传递
请看实例代码:
public class RawType {

	public static void main(String[] args) {
		String s1 = new String("abcString");
		StringBuffer s2 = new StringBuffer("abcBuffer");
	
		changString(s1);
		System.out.println(s1);
		
		changStringBuffer(s2);
		System.out.println(s2);
	}
	private static void changString(String a1) {
		a1 += ",ABCString";
	}
	
	private static void changStringBuffer(StringBuffer a2) {
		a2.append(",ABCBuffer");
	}
}


打印结果:
abcString
abcBuffer,ABCBuffer

分析:可以看出String没有改变,而StringBuffer却改变了,有人说它不都是引用类型吗,为什么一个改变了一个却没有改变呢?

这个时候你就要注意java引用类型在内存中是如何分配的了,前面我们说过引用类型作为参数传递时传递的是对象的地址拷贝

(1) 当方法changString(String s1),changStringBuffer(StringBuffer s2)被调用之前内存中的地址分配如图所示,s1,s2是在栈中的两个地址,他们分别存储的是一个String和StringBuffer的对象引用.


图 2-1


(2) 当方法changString(String a1),changStringBuffer(StringBuffer a2)被调用的时候,内存中分别产生了s1,s2的一份地址拷贝a1,a2它们的指向自然是和s1,s2一样,内存中的地址分配如图所示,



图 2-2


(3) 当changString(String a1)中执行a1 += ",ABCString";操作时,据我们对String的了解,String一旦对象一旦创建就不可变(地址指向内容不可变,这里指abcString不可变);同时也由于java中String对"+"进行了重载,a1 += ",ABCString";事实上是相当于执行了a1 = new StringBuffer(s1).append(",ABCString")操作,可以看出是重新创建了一个新的对象,在新的对象里面存放的是abc,ABCString,也就是s1的地址拷贝此时有了新的地址(故指向的对象不一样了).

而changStringBuffer(StringBuffer a2)中执行a2.append(",ABCBuffer");时,并未产生新的对象,只是在原有对象的基础上追加",ABCBuffer",此时内存中的内存分配如图:


图 2-3


(4) 当两个方法调用都结束时,临时地址拷贝a1,a2都自动消失,那么此时的changString(String a1)中对象"abcString,ABCString”就没有了引用(表现出来的时候我们在程序中无法访问它了),因为对象本身是在堆中,故其会在某个时候被java虚拟机当成垃圾回收掉,它的内存空间重新归还给系统,此时内存分配情况如图所示:


图 2-4


(5) 从图图 2-4 和 图 2-3就可以看出为什么打印的结果是:
abcString
abcBuffer,ABCBuffer

综上所述:java中引用类型当参数时候,传递的是实参的一份地址拷贝,但是实参和形参开始的指向是一样的,都是指向相同的对象,因为地址一样。

那么当参数是数组的时候呢,而数组是基本类型或引用的时候又会怎么样呢?且听下回分解...
  • 大小: 17.8 KB
  • 大小: 10.4 KB
  • 大小: 17.5 KB
  • 大小: 22.2 KB
  • 大小: 13.1 KB
分享到:
评论

相关推荐

    11.java参数传递.zip

    11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java...

    13.java参数传递之引用传递.zip

    13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....

    58.java参数传递机制.zip

    58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递...

    Java参数传递PPT

    Java参数传递机制是编程中的重要概念,尤其是在Java中,它对于理解如何在方法间操作数据至关重要。本PPT深入探讨了这一主题,旨在帮助学习者彻底理解Java中的参数传递方式。 首先,我们要回顾面向对象的基本概念。...

    java参数传递

    这里详细的说明了,java参数传递的过程,引用传递,值传递

    Java参数传递的经典示例

    Java参数传递机制是编程中非常重要的概念,它涉及到基本类型和引用类型的差异。在Java中,参数传递主要有两种方式:值传递(Value Passing)和引用传递(Reference Passing)。虽然Java官方文档并未明确提及引用传递...

    java 参数传递

    Java 中的参数传递机制是一个经久不息的讨论话题,究竟是“传值”还是“传引用”,双方各执一词,互不相让。本文将通过详细的分析和实例,揭开 Java 参数传递机制的奥秘。 基本类型作为参数传递 首先,我们来看...

    java方法的参数传递其二.docx

    Java 方法参数传递是 Java 编程语言中的一种基本机制,在方法调用时将参数传递给方法体内的变量,但是在传递过程中,参数的类型会对传递结果产生影响。在本文中,我们将讨论 Java 方法参数传递中的引用类型传递。 ...

    java参数传递 java 参数.doc

    Java 参数传递机制是编程中的重要概念,尤其是在Java中,它涉及到“值传递”和“引用传递”的理解。这里我们将深入探讨这两个概念,并结合给定的示例代码进行解析。 首先,我们看“值传递”。在Java中,基本类型...

    java参数传递学习demo

    java的参数传递对比,体现了值传递和引用传递的区别,是我在java入门是写的学习demo

    java参数的传递与返回值

    #### 一、Java参数传递的基本概念 在Java中,方法(或称为函数)可以通过参数来接收外部的数据,并且能够返回处理后的结果。参数的传递方式主要有两种:值传递(Pass-by-value)和引用传递(Pass-by-reference)。...

    Java数组传递及可变参数操作实例详解

    当把数组作为参数传递给方法时,传递的实际上就是数组对象的引用。 Java 可变参数是指在方法中可以传递同类型的可变参数,JDK 1.5 开始支持这种特性。可变参数可以使得方法更加灵活、方便使用。可变参数的使用规则...

    JAVA反射参数传递概略

    这篇博客文章“JAVA反射参数传递概略”将深入探讨如何使用反射来处理方法参数,尤其是涉及到参数传递的细节。 首先,让我们理解什么是参数传递。在Java中,有两种基本的参数传递方式:值传递和引用传递。值传递是将...

    62.java引用类型的参数传递.zip

    62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递....

    59.java基本类型的参数传递.zip

    59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递....

    java参数传递时到底是值传递还是引用传递分享.pdf

    Java参数传递机制是一个常见的面试问题,它涉及到Java语言的基础特性。Java中参数传递的方式有两种理解:值传递和引用传递,但这两种说法实际上是对同一种机制的不同角度的描述。下面将详细解释这两种理解方式。 ...

    java传递参数的方法

    java传递参数的方法 很的东西 大家下载学习一下

    JNI中C和Java参数传递详细例子

    ### JNI中C和Java参数传递详解 #### 一、引言 Java Native Interface (JNI) 是Java平台标准的一部分,用于让Java代码与其他语言写的代码进行交互。本文将深入探讨在JNI环境中,C/C++和Java之间如何进行参数传递,...

    Java的引用和函数参数传递

    ### Java的引用与函数参数传递详解 #### 一、Java中的引用基础 在Java中,对象的引用扮演着类似于其他编程语言(如C/C++)中指针的角色,但是Java的引用比传统的指针更加安全且易于管理。这是因为Java的设计者们...

    java参数传递时到底是值传递还是引用传递[归类].pdf

    Java中的参数传递机制是一个经常引起讨论的话题,尤其是在面试和学习过程中。Java的参数传递方式实际上是一种特殊的"值传递",通常被称为"按引用传递对象的引用",这与C++等语言中的引用传递有所不同。以下是对这个...

Global site tag (gtag.js) - Google Analytics