`
spirithenry
  • 浏览: 1750 次
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

TIJ Learning:值传递与引用传递

阅读更多

 

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

 

public class ValuePass {

    public static void main(String[] args) {
    	//primitive type
    	int i = 1;
    	int j = 2;
    	operator(i,j);
    	
    	//String type
        String a = "a";
        String b = "b";
        operator(a, b);
        
        //String Array
        String[] array1 = new String[]{"1","2","3"};
        String[] array2 = new String[]{"4","5","6"};
        operator(array1,array2);

        
        //StringBuilder --> Object
        StringBuilder sb1 = new StringBuilder("a"); 
        StringBuilder sb2 = new StringBuilder("b");
        operator(sb1, sb2);
        
        //Object
        People p1 = new People("p1");
        People p2 = new People("p2");
        operator(p1, p2);
        
        System.out.println(i + "," + j);
        System.out.println(a + "," + b);
        System.out.println(array1[0]+array1[1]+array1[2] + "," + array2[0]+array2[1]+array2[2]);
        System.out.println(sb1 + "," + sb2);
        System.out.println(p1.name + "," + p2.name);
    }


        // int type just a value copy transfer
        public static void operator(int i, int j) {
    	  i = 3;
    	  j += 1;
	}

        // String type variable is final, change value will create a new String.
        public static void operator(String a, String b) {
            a += "aa";
            b = a;
        }
    
        //Array type variable regarded as an object, transfer copy of address
        public static void operator(String[] array1, String[] array2) {
    	    array1[0]="111";
    	    array2 = new String[]{"7","8","9"};//point to a new array
    	    array2[0] = "10";
	}

        //StringBuilder type variable is to transfer a reference of object(copy of address) from variable to parameter
        public static void operator(StringBuilder a, StringBuilder b) {
            a.append("aaa");//change value --> affect original object
        
            //point to new object --> change b not affect original object
            b = new StringBuilder("bbb");
            b.append("ccc");
        }
    
        // Object
        public static void operator(People p1, People p2) {
            //p1 is the reference of Object p1, change will affect original object
        	p1.name = "p3";
            
        	//p2 point to new address, no relationship with variable p2.
	        p2 = new People("p4"); 
	        p2.name = "p5";
	}
}

class People{
	String name;
	People(String name){
		this.name = name;
	}
}

 

1. 基本数据类型:实际传递的是数值,形参的改变不会影响实参本身。

2. String类型:String类型是final的,所有改变String的操作都会new一个新的String(新内存地址),原本的String引用则不会受到影响。

3. Array类型:数组实参到形参的传递是引用的传递,传递的是内存地址的拷贝,形参中数组每一项的改变也会影响原本数组对象。

4. StringBuilder类型:也是传递的内存地址的拷贝。

5. 对象类型:

在方法中把对象作为参数,方法调用时,参数传递的是对象的引用(内存地址),实际参数把对对象的引用(内存地址)传递给形式参数。这是实际参数与形式参数指向同一个地址,即同一个对象,方法执行时,对形式参数的改变实际上就是对实际参数的改变,这个结果在调用结束后被保留了下来。

对于对象类型,如果在方法中修改了成员变量的值,那个修改是生效的,方法调用结束后,成员变量值会改变,但是如果方法中把形参指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。

 

 

分享到:
评论

相关推荐

    tij4:java中的思考第四版

    2. **类与对象**:Java的核心是类和对象。类是对象的蓝图,它定义了对象的属性和行为。对象是类的实例,可以执行类中定义的操作。掌握如何创建和使用类,理解封装、继承和多态是Java面向对象编程的基础。 3. **封装...

    thinkinjava源码-TIJ4:java中思考的源代码

    "TIJ4: java中思考的源代码"指的是该书第四版(TIJ4)中所涉及的源代码。这本书不仅仅是一本教程,更是学习者理解Java编程思想的重要参考资料。现在我们来详细探讨一下这些源码所涵盖的知识点。 1. **基础语法**: ...

    TIJ4-solutions

    1. **基础语法**:TIJ4介绍了变量、数据类型、运算符、控制流(if、switch、for、while)、方法、类与对象等基础知识。解决方案会展示如何正确使用这些语法进行程序设计。 2. **面向对象编程**:书中深入探讨了类、...

    Proyecto_Graficos_2021_tij2048:图形项目,使用Panda 3D播放python制作的社交主题的老游戏

    《图形项目:Panda 3D与Python打造的社交主题老游戏》 在这个名为"Proyecto_Graficos_2021_tij2048"的项目中,开发者运用了Python编程语言以及Panda 3D游戏引擎,创造了一个具有社交元素的经典游戏。这个项目不仅...

    TIJ阅读笔记.doc

    这与对象引用共享不同,对象引用共享意味着多个引用指向堆中的同一对象,改变一个会影响所有引用。 String类是一个特殊案例,它的对象既可以在栈中以引用形式存在,也可以在堆中创建。例如,`String str = "abc";`...

    TIJ4-code:Java源代码中的Tink

    完成后,您应该看到几个级别的目录,并且在C:\TIJ4\code目录中,除其他外,您C:\TIJ4\code看到与本书各章相对应的子目录。 从的安装Java JDK SE5或更高版本。 您最终还将需要该文档,该文档可在该页面的后面找到。...

    TIJ4-code-master.zip及相关jar包、练习题答案

    总的来说,这个压缩包是学习和进阶Java编程的理想资源,它将理论与实践紧密结合,有助于读者深入理解和掌握Java语言,并培养良好的编程习惯。通过实践和不断的学习,可以逐步提升编程技能,成为一名熟练的Java开发者...

    tij4-code:java编程思想第四版-GIT

    "tij4-code:java编程思想第四版-GIT" 指的是该书的源代码已经托管在了Git版本控制系统中,方便读者查阅和学习。Git是一种分布式版本控制系统,用于跟踪对文件或项目的修改,非常适合软件开发团队协作和管理代码。 ...

    TIJ_Exercises:Java 4 中思考的练习

    《TIJ_Exercises:Java 4 中思考的练习》是一份专为学习和深化Java编程技能而设计的资源。这个项目基于《Thinking in Java》第四版中的练习,这本书由Bruce Eckel编写,是Java编程领域的一本经典教材。通过解决这些...

    thinkinjava源码-TIJ4Example:Java4示例源代码中的思考

    2. **类与对象**:Java是一种面向对象的语言,"TIJ4Example"会展示如何定义类、创建对象、封装、继承和多态等面向对象编程的概念。这有助于理解对象的生命周期和它们之间的关系。 3. **异常处理**:Java异常处理...

    TIJ4 Code

    Thinking in java 4 Source Code

    TIJ4 Initialization Cleanup

    TIJ4 Initialization Cleanup

    TIJ4-Maven:用于在 Java 中思考的 maven repo

    这个仓库包含了书中所提及的各种项目和代码示例,便于读者在学习过程中直接引用和实践。通过使用 Maven,开发者可以更方便地管理这些示例的依赖,快速搭建开发环境,从而加深对 Java 编程的理解和应用。" 【详细...

    javajar源码-TIJ4-code:java编程思想第四版源码maven构建注意:在D:\Java\jdk1.7.0_80\jre\lib

    《javajar源码-TIJ4-code:java编程思想第四版源码maven构建注意:在D:\Java\jdk1.7.0_80\jre\lib》这个压缩包文件,主要涉及的是Java编程语言的学习资源,特别是《Thinking in Java》第四版的源代码,该书由Bruce ...

    TIJ4-code.rar_TI

    《深入理解Java编程思想》是Java开发者们常常参考的一本经典书籍,其源代码"TIJ4-code.rar_TI"提供了一种深入学习Java编程的宝贵资源。这本书籍着重于理论与实践相结合,通过丰富的示例代码帮助读者掌握Java的核心...

    Thinking in java\TIJ4-solutions-demo

    《Thinking in Java》(TiJ)是一本经典的Java编程语言学习教材,由Bruce Eckel撰写,首次出版于1998年,并随着Java的发展不断更新版本。第四版(TIJ4)在2006年2月发布,而配套的解决方案指南则是在2007年9月出版。...

    TIJ4-code_idea:Java 中的思考第 4 版练习题

    "TIJ4-code_idea"项目是这本书的代码示例和练习集,使用IntelliJ IDEA开发环境进行编译和运行。下面我们将详细探讨这个项目中可能涉及的Java知识点。 1. **基础语法**:Java的基础语法包括变量、数据类型、运算符、...

    The Thinking in Java Annotated Solution Guide(TIJ4-solutions)

    根据提供的文件信息,我们可以推断出这是一本与《Thinking in Java》第四版相关的解决方案指南。下面将基于这些信息来生成相关知识点。 ### 关于版权与免责声明 在深入讨论本书内容之前,首先需要明确的是,...

    Thinking In Java 第四版-源代码TIJ4-code

    1. **基础语法与数据类型**:源代码中涵盖了Java的基本语法,如变量声明、数据类型(包括基本类型和引用类型)、运算符、控制流语句(if、switch、for、while等)以及方法定义。 2. **面向对象编程**:这是Java的...

Global site tag (gtag.js) - Google Analytics