`

Java之语法之方法调用之地址传值之空对象(null)

阅读更多
一、问题:


    public void test(){
        String name = null;
        setReference(name);
        
        if(name == null){
            System.out.println("name is null");
        }
        
    }

    private void setReference(String name){
        name = "java";
    }




输出:


// name is null


原因是:

只有非空的引用对象才可以传值。



二、Java是引用传递还是值传递?




package com.journaldev.test;

public class Test {

	public static void main(String[] args) {

		Balloon red = new Balloon("Red");
		Balloon blue = new Balloon("Blue");
		
		swap(red, blue);
		System.out.println("red color="+red.getColor());
		System.out.println("blue color="+blue.getColor());
		
		foo(blue);
		System.out.println("blue color="+blue.getColor());
		
	}

	private static void foo(Balloon balloon) {
		balloon.setColor("Red");         // refer to param.
        
		balloon = new Balloon("Green");  // refer to a new object.
		balloon.setColor("Blue");
	}

	//Generic swap method
	public static void swap(Object o1, Object o2){
		Object temp = o1;
		o1=o2;
		o2=temp;
	}
}

/*

red color=Red
blue color=Blue

blue color=Red

*/




通过上面可以看出,Java 是值传递。而传递的是一个引用。


“值传递”和“引用传递”的区别是什么?

在“一、问题”中,如果由于 String name = null;,此时根本没有值,
也就是没有产生新的对象。所以无法进行赋值。
那么,对于有值的情况呢?

下面这段代码的输出是什么?

    public void run(){
        String name = "AAA";
        setReference(name);
        
        System.out.println(name);        
    }

    private void setReference(String name){
        name = "BBB";
    }




答案:

AAA 。

当 "AAA" 被作为参数传递过来时,方法体中的局部变量 name 指向 "AAA",
然后 赋值运算符(=)把新的值 "BBB" 赋给了局部变量 name。

因为是值传递,只不过传递的值是一个地址。传递的是地址,就叫“地址引用”吗?
非也。何为“引用”?“引用”的目地是为了什么?显然,引用到地址,就是想要
对其修改。能够“引用”到地址,修改地址。这里的“引用”即为“修改”之意。

但是,Java方法体内并不会直接在传递过来的地址上对其做赋值或修改,
而是在方法体内生成局部变量(参数),指向这个地址。然后对局部变量进行操作。

即:方法体内,只能引用,无法修改。

只能引用参数的值(地址),而不能对这个值(地址)进行修改或赋值操作。
这里特别需要注意赋值运算符(=)所起的作用。

所以Java是值传递。无法修改或修改不了传递过来的参数的地址的指向。


Java is Pass by Value and Not Pass by Reference!






引用:

http://stackoverflow.com/questions/14017461/null-reference-in-java


http://www.journaldev.com/3884/java-is-pass-by-value-and-not-pass-by-reference





-


分享到:
评论

相关推荐

    JAVA与C#的区别

    JAVA与C#都是编程语言,它们是两个不同的方向的语言,虽然它们都是面向对象的语言,但它们有很多不同之处。本文将从命名空间、数据类型、变量命名、注释、输出、控制流语句、数组、方法传递参数、访问修饰符、继承、...

    JAVA试题(20211007020404).pdf

    7. 在这个例子中,`change`方法的参数是传值引用,`str`和`ch`的原始对象分别是一个字符串和字符数组。改变`str`的引用不会影响实例变量`str`,而修改`ch`数组的元素会影响到原数组。因此,输出结果是`good and Abc`...

    Java语言与C++语言的差异总结

    Java语言与C++语言在设计思想、语法特性以及内存管理等方面存在诸多差异,这些差异体现了两种语言的不同设计理念和应用场景。以下是对这些差异的详细说明: 1. 引用的初始化:Java的引用可以在声明后初始化,而C++...

    java面试题集锦

    构造函数的主要用途之一是在创建对象时设置初始状态或分配必要的资源。 - **结论**: D选项正确,因为上述所有关于构造函数的描述都是正确的。 **2. 异常处理机制** - **选项A**: 错误。catch部分捕捉到异常时,并...

    jdbc基础和参考

    ORM:使用元数据信息来描述对象和数据库之间的关系,并且能够自动实现java中持久化对象到关系型数据库中表的映射 脏检查:自动对缓存中的数据进行检查,并且选择在合适的时机和数据库之间进行交互,以保持数据的...

    JSon转换Sturs2的AJAX的应用

    而JSON由于其结构与JavaScript的对象语法相似,因此成为了AJAX传输数据的理想选择。 在"JSon转换,Sturs2的AJAX的应用"这个主题中,我们可能会讨论以下知识点: 1. JSON格式:JSON格式由键值对组成,键用引号包围...

    学习js的最好的资料(例子很丰富、也很经典)

    首先,JavaScript的基本语法与C++和Java类似,它是一种解释型的、弱类型的、基于原型的语言。学习JavaScript首先要了解变量声明(var、let、const)、数据类型(包括基本类型:字符串、数字、布尔、null、undefined...

    编程修养-程序员不可或缺的书

    这种方法尤其适用于大型项目,可以避免很多难以追踪的编译错误。 #### 8. 在堆上分配内存 **在堆上分配内存**是动态内存分配的一种方式。在C/C++中,可以使用`malloc`或`new`来分配内存空间,但在使用完毕后需要...

Global site tag (gtag.js) - Google Analytics