`
雪馨25
  • 浏览: 125236 次
  • 性别: 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中的值传递和引用传递

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

    为什么Java只有值传递

    我们先看一下值传递和引用传递的概念和区别 值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递:是指在调用函数时将实际参数的地址直接...

    java及C++中传值传递、引用传递和指针方式的理解.docx

    java及C++中传值传递、引用传递和指针方式的理解.docx

    Java值传递的一些理解 1

    1.栈内存:主要存放函数中定义的基本类型变量,对象的引用 2.堆内存:主要存放由new 创建的对象和数组,Java垃圾回收器回收这部分内容 3.方法区内存:主要

    值类型和引用类型的区别

    值类型和引用类型的区别: 似乎“值类型和引用类型的区别”是今年面试的流行趋势,我已然是连续三次(目前总共也就三次)面试第一个问题就遇到这个了,这是多大的概率啊,100%. 言归正传,咱还是先来探讨探讨这二者...

    Java零基础-参数传递-2.md

    读者将学习Java中方法调用时的参数传递方式,并重点探讨基本类型和引用类型在参数传递过程中的特点和区别。此外,我们还将介绍可变参数和返回值的使用方法。 能学到什么: 学习Java中方法调用时的参数传递方式。 ...

    Java零基础-参数传递-1.md

    读者将学习Java中方法调用时的参数传递方式,并分别介绍基本类型和引用类型在参数传递过程中的特点和区别。 能学到什么: 学习Java中方法调用时的参数传递方式。 理解基本类型和引用类型在参数传递过程中的特点和...

    java及C++中传值传递、引用传递和指针方式的理解

    为什么 Java 只有值传递,但 C++ 既有值传递,又有引用传递呢?今天我们就来探讨下这个问题,有需要的朋友可以参考下

    Java是值传递还是引用传递

    首先写一个简便的Employee,以便测试使用。 class Employee { ...  然后写一个函数,传入一个Emplyee对象,修改name,如果函数执行完毕原来的employee的name值发生变化,按照我们的理解,会认为是引用

    Java中数据类型,对象,传递

    1.数据类型分为引用数据类型和...传递分为值传递和引用传递:  形象的例子:值传递即是你把10元现金转交给其他人,而引用传递则是你把10元现金存放的位置告诉其他人。  用简单的代码来理解:  Plane p = new Pla

    Java语言基础的理解与笔记

    主要简述Java基础,包括概述,基础语法,流程控制语句,数组,方法和值传递 适合刚开始的新手参考 主要可以使用在计算机刚入门的小伙伴或者回来看一看复习一下简单的基础的 ① 凡本网站注明“来源:本网站、子网站或...

    Java学习笔记之深入理解引用

    引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解的版本...

    AIC的Java课程1-6章

     区别和掌握按值传递与按引用传递。 第4章 面向对象(封装) 4课时  理解类封装属性(数据成员)和行为(方法成员),区别类和对象。  能够定义类,创建类的对象(实例化类)和通过对象引用访问...

    疯狂JAVA讲义

    1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢? 8 学生提问:为什么不安装公共JRE系统呢? 9 1.4.2 设置...

    java 编程入门思考

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Java初学者入门教学

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    java联想(中文)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的每个语法都提供了一个或多个例程讲解 ...

    JAVA_Thinking in Java

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

Global site tag (gtag.js) - Google Analytics