`
雪馨25
  • 浏览: 129319 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

【java】值传递和引用传递理解

阅读更多

一、理解

★ 当一个变量最为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。

  ☆ 值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值

   引用传递的特点:方法内部对传进去的参数作的改变也会影响方法外部的变量的值

二、记忆

1、基本类型(8种)的传递都是值传递

2、引用类型(除String外)都是引用传递(传递引用的副本)

3、Strng比较特殊,它虽然是引用类型,但是却是值传递

三 示例

3.1 基本类型:如 int

 

public class StudyInt {
	public static void main(String[] args) {
		new StudyInt().printFirst();
	}
	private void printFirst() {
		int i = 2;
		testChange(i);
		System.out.println("printFirst:i = "+i);
	}
	private void testChange(int i) {
		i = 4;
		System.out.println("testChange: i = "+i);
	}
}

打印结果:

testChange: i = 4
printFirst:i = 2

理解:

i 作为参数将值传递给testChange方法,不论值在testChange 中怎么变,都不影响 i 在printFirst中的值

3.2 引用类型:如 新建Appoint类

 

public class StudyAppoint {

	public static void main(String[] args) {
		new StudyAppoint().printFirst();
	}
	private void printFirst() {
		Appoint iAppoint = new Appoint();
		sysoutAppoint("1 初始值:printFirst", iAppoint);

		testChange(iAppoint);
		sysoutAppoint("2 传参更改值:printFirst", iAppoint);
		// 重点testNew方法传递的是引用的副本,当改变副本的指向地址时,原属性本身的值不改变
		testNew(iAppoint);
		sysoutAppoint("3 传参new对象:printFirst", iAppoint);
		// 重点理解testChangeAndNew
		testChangeAndNew(iAppoint);
		sysoutAppoint("4 传参改值并new对象:printFirst", iAppoint);
	}
	private void testChange(Appoint iAppoint) {
		iAppoint.iInt = 2;
		iAppoint.iStr = "testChange";
		sysoutAppoint("testChange", iAppoint);
	}
	private void testNew(Appoint iAppoint) {
		Appoint i = new Appoint();
		i.iInt = 3;
		i.iStr = "testChangeNew";
		iAppoint = i;
		sysoutAppoint("testNew", iAppoint);
	}
	private void testChangeAndNew(Appoint iAppoint) {
		iAppoint.iInt = 4;
		iAppoint.iStr = "testChangeAndNew 1";
		Appoint i = new Appoint();
		i.iInt = 5;
		i.iStr = "testChangeNew 2";
		iAppoint = i;
		sysoutAppoint("testChangeAndNew", iAppoint);
	}
	/**
	 * 打印出执行的方法中指定的属性的值
	 */
	private void sysoutAppoint(String methodName, Appoint iAppoint) {
		System.out.println(methodName + ":iAppoint.iInt = " + iAppoint.iInt);
		System.out.println(methodName + ":iAppoint.iStr = " + iAppoint.iStr);
	}
}

class Appoint {
	int iInt = 1;
	String iStr = "aaa";
}

打印结果:

理解:

1、testChange :iAppoint作为参数在testChange方法中传递的是iAppoint 引用的副本,指向同一地址,对副本值进行改变改变的也就是地址的中的值,iAppoint 指向的是相同地址所以也是改变的

2、testNew:iAppoint作为参数在testChange方法中传递的是iAppoint 引用的副本,指向同一地址, 当引用的副本指向的地址更改后,无论对引用副本值做什么改变,对iAppoint本身指向的地址没有影响

3.3 String 和 StringBuffer

 

public class StudyString {

    void printFirst(){
    	String i="i -- string ";
    	String i2= new String("i2 -- new string");
    	StringBuffer ibuf = new StringBuffer("ibuf -- strbuf");
    	sysout("1 printFirst",i,i2,ibuf);  	
    	testChange(i,i2,ibuf);  	
    	sysout("3 printFirst",i, i2, ibuf);
    	testChange2(i, i2, ibuf);
    	sysout("5 printFirst",i, i2, ibuf);
    }
    /**
     * 分别更改值,查看打印内容
     */
    private void testChange(String i, String i2, StringBuffer ibufferBuffer) {
    	i+=" ; 改变值";
    	i2 += " ; 改变值";
    	ibufferBuffer.append(" ; 改变值");
    	sysout("2 testChange",i, i2, ibufferBuffer);  	
    	
	}
	private void testChange2(String i, String i2, StringBuffer ibufferBuffer) {
		String inew = "inew --  new";
    	i=inew;
    	String i2new = new String("i2new -- new");
    	i2=i2new;
    	StringBuffer iBuffernew = new StringBuffer("iBuf -- new");
    	ibufferBuffer = iBuffernew;
    	sysout("4 testChange2",i, i2, ibufferBuffer);
	}
	/**
     * 打印结果
     */
	private void sysout(String methodStr,String i,String i2,StringBuffer ibufferBuffer) {
		System.out.println(methodStr+": i = "+i);
    	System.out.println(methodStr+": i2 = "+i2);
    	System.out.println(methodStr+": ibuf = "+ibufferBuffer);
	}
	public static void main(String[] args) {
		new StudyString().printFirst();
	}
}

打印结果:

 

理解:

1、Strng是引用类型,但是却是值传递,不论值在testChange中怎么变,或者改变地址都不影响在printFirst中的值

2、StringBuffer方法中传递的是引用的副本

四、String的扩展知识(equal和==)

public class StringEqual {
 public static void main(String[] args) {
  new StringEqual().printFirst();
 }
 private void printFirst() {
  String iStr = "aaa";
  String iStr2 = "aaa";
  String iNewStr = new String("aaa");
  String iNewStr2 = new String("aaa");
  System.out.println("iStr == iStr2: "+(iStr==iStr2));
  System.out.println("iStr.equals(iStr2): "+(iStr.equals(iStr2)));
  System.out.println("iStr == iNewStr: "+(iStr==iNewStr));
  System.out.println("iStr.equals(iNewStr): "+(iStr.equals(iNewStr)));
  System.out.println("iNewStr2 == iNewStr: "+(iNewStr2==iNewStr));
  System.out.println("iNewStr2.equals(iNewStr): "+(iNewStr2.equals(iNewStr)));
 }
}

打印结果:
iStr == iStr2: true
iStr.equals(iStr2): true
iStr == iNewStr: false
iStr.equals(iNewStr): true
iNewStr2 == iNewStr: false

iNewStr2.equals(iNewStr): true

理解:

==在java中是比较引用的,即在内存中的地址。而String的equals()是比较字符串的内容。

学习地址http://www.51testing.com/html/68/n-816868.html

分享到:
评论

相关推荐

    java 值传递和引用传递的比较

    在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...

    Java:按值传递还是按引用传递详细解说

    本文将深入探讨Java中的参数传递机制,并通过具体的代码示例和内存分配图解来帮助读者理解按值传递和按引用传递的概念。 #### 二、按值传递的概念与特点 按值传递是指在函数或方法调用过程中,传递给函数或方法的...

    java值传递与引用传递

    在Java编程语言中,函数参数的传递方式有两种:值传递和引用传递。理解这两种机制对于编写高效、无误的代码至关重要。以下是对这两种传递方式的详细解析。 首先,值传递是指函数调用时,实际参数的值被复制一份传给...

    java值传递和引用传递详解

    理解值传递和引用传递对于优化代码和避免意外的副作用至关重要。在编程时,需要根据实际需求选择合适的参数传递方式,确保代码的正确性和可维护性。对于基本类型,值传递可以防止方法内部的修改影响到外部;而对于...

    Java面向对象值传递和引用传递

    Java 面向对象值传递和引用传递 Java 面向对象编程中,参数传递是非常重要的一个概念。参数传递有两种方式:值传递和引用传递。了解这两种方式的区别是非常重要的,因为它们对程序的执行结果产生了很大的影响。 值...

    值传递和引用传递

    本文将详细介绍值传递和引用传递的概念、用法以及它们之间的区别,并通过Java语言中的具体示例来加深理解。 #### 二、值传递 **值传递**是指在函数或方法调用时,传递给函数的实际参数的值被复制一份到形参,即形参...

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

    Java中参数传递的方式有两种理解:值传递和引用传递,但这两种说法实际上是对同一种机制的不同角度的描述。下面将详细解释这两种理解方式。 首先,我们来看值传递的理解。在Java中,当一个对象作为参数传递给方法时...

    Java语言中参数值传递和引用传递比较.pdf

    Java 语言中参数值传递和引用传递比较 Java 语言中参数值传递和引用传递是两种不同的参数传递...因此,在 Java 编程中,理解参数值传递和引用传递的区别是非常重要的,以便正确地使用参数传递方式,避免参数传递错误。

    Java中的值传递和引用传递

    当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。  值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值  引用传递的特点:方法内部对传...

    Java值传递的一些理解 1

    所以虽然值传递复制的是栈内的“原值”,但表现出来的特性仍然是趋向于引用传递(因为你复制一个引用的原值,并没有卵用)。例如,Object obj = new Object();函数调用时,obj的引用被复制到调用函数的栈内存中,...

    Java是值传递,传对象引用也是通过值

    总的来说,理解Java中的值传递和对象引用传递对于编写高效、无误的代码至关重要。无论是基本类型还是对象类型,参数传递都是以值的形式进行,但对象类型的值是其引用,允许我们在方法内修改对象的状态,而不影响方法...

    Java 值传递Visio资源

    Visio是一种流程图和矢量图形软件,这些图形文件将帮助开发者以视觉化的方式理解Java中的值传递和引用传递。"方法传入对象类型参数,对象引用不能被修改"的示例可能显示了即使在方法内部改变了对象引用,外部的引用...

    Java中的值传递和引用传递实例介绍

    我们将详细探讨Java中的值传递和引用传递的概念,以及它们之间的区别。 首先,值传递是Java中最基本的参数传递方式。当一个变量作为参数传递给方法时,实际上是传递了该变量存储值的一个副本。这意味着在方法内部对...

    java中的值传递和引用传递[汇编].pdf

    Java编程语言中,参数传递的方式主要有两种:值传递和引用传递。然而,由于Java不支持指针,所以严格意义上的引用传递并不存在。但是,通过对象的传递,Java实现了类似引用传递的效果。 值传递是Java中基本类型的...

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

    Java的参数传递方式实际上是一种特殊的"值传递",通常被称为"按引用传递对象的引用",这与C++等语言中的引用传递有所不同。以下是对这个主题的详细解释。 在Java中,所有的参数传递都是基于值的,但这涉及到一个...

    Java 值传递和引用传递详解及实例代码

    Java中的值传递和引用传递是编程中非常重要的概念,它们涉及到函数或方法调用时参数的传递方式。值传递指的是函数或方法接收到的是变量的一个副本,而引用传递则是函数或方法接收到的是变量内存地址的副本。这两种...

    值传递与引用传递-内存解析

    在编程语言中,值传递和引用传递是函数参数传递的两种基本方式,它们涉及到内存管理、数据安全以及程序效率等多个重要方面。这篇文章将深入探讨这两种传递方式,并通过内存解析来帮助理解它们的工作原理。 首先,...

    Java中的值传递和引用传递的区别.doc

    根据传递的数据类型不同,Java中有两种主要的参数传递方式:值传递(Value Passing)和引用传递(Reference Passing)。这两种方式决定了函数内部如何处理传入的参数,进而影响到函数外部的原始数据是否会发生变化。...

Global site tag (gtag.js) - Google Analytics