`
NSCoffee
  • 浏览: 1916 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Java中的引用传递参数 为什么错误?

 
阅读更多
请问下面的代码为什么会出现错误?
	public static void main(String[] args) {
		List<String> a=null;
		test(a);
		System.out.println(a.size());
	}
	public static void test(List<String> a) {
		a = new ArrayList<String>();
		a.add("cc");
	}
分享到:
评论
4 楼 黑白两相望 2012-04-04  
public static void main(String[] args) {
	List<String> a = new ArrayList<String>();
	System.out.println(a);
	a.add("123");
	a.add("234");
	test(a);
	System.out.println(a.size());
		
}
public static void test(List<String> list) {
//	list = new ArrayList<String>(); // 注释和不注释这个比较下看看
	list.add("cc");
	System.out.println(list.size());
}
3 楼 黑白两相望 2012-04-04  
public static void main(String[] args) {
	Object a = new Object();
	System.out.println(a);// 看看存的是啥
	test(a);
	System.out.println(a);// 同上
		
}
public static void test(Object obj) { // 以示区别把参数名改一下
	obj = new Object();
	System.out.println(obj);// 同上
}
// 这样就能很清楚的看出 到底是什么问题
2 楼 黑白两相望 2012-04-04  
sorry 按快了 没发全
1 楼 黑白两相望 2012-04-04  
好说,一开始是指针a存的是null对象的地址,然后调了一个test(...)方法,
然后问题来了,有的书上有值传递和引用传递,其实可以说都是值传递,对于基本类型的值,
传的是其基本类型本身值的拷贝,对于引用类型传的是其地址值的拷贝,
其实大可理解为都是值传递... 那么后面传给test(...) 方法的是一个对象的地址值,
这个地址值赋给了方法的"参数a"[区别于上面的a],然后方法执行时又new了一个ArrayList(),并且把这个新的地址赋给了"参数a"[关键所在],然后操作这个地址指向的新对象...
然而在main方法中的指针a还是原来的地址值,所以再后面的System.out.println(a.size());
抛了空指针异常
--------------------------------
比较下面两段代码
public static void main(String[] args) {
		/*List<String> a = new ArrayList<String>();
		System.out.println(a);
		a.add("KOH");
		a.add("KOS");
		test(a);
		System.out.println(a);*/
		Object a = new Object();
		System.out.println(a);
		test(a);
		System.out.println(a);
		
	}
	public static void test(Object a) {
		/*a = new ArrayList<String>();
		a.add("cc");
		System.out.println(a);*/
		a = new Object();
		System.out.println(a);
	}

相关推荐

    Java的引用和函数参数传递

    - **引用传递的本质**:Java中的引用传递本质上是传递对象的引用,而不是对象本身。这意味着在方法内部对对象所做的任何改变都会影响到原始对象。 - **引用与值的区别**:与基本类型的值传递不同,引用传递不会创建...

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

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

    Java参数传递PPT

    Java参数传递的规则是:**Java只使用值传递,但这种值传递对于对象参数表现为类似引用传递的行为。** 在值传递中,函数或方法接收的是原始数据类型(如int、double、boolean)参数的副本。例如,如果有一个方法...

    Java参数传递的经典示例

    在Java中,参数传递主要有两种方式:值传递(Value Passing)和引用传递(Reference Passing)。虽然Java官方文档并未明确提及引用传递,但Java中的对象实际上是以引用的方式进行传递。 首先,我们来看基本类型(如...

    java语言中的参数传递

    Java 有两类参数传递方式:按值传递(by value)和按引用传递(by reference),虽然 Java 没有真正的按引用传递,但其效果类似于 C++ 或 C# 中的引用传递。 1. **按值传递(by value)**: - 适用于基本数据类型...

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

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

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

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

    深入了解为什么Java中只有值传递?

    这也解释了为什么在 Java 中,我们可以改变对象的状态,但不能改变对象引用的值。这是因为方法得到的是对象引用的拷贝,而不是原始对象本身。 在 Java 中,对对象的参数传递是按值传递的,而不是按引用传递的。这...

    关于java的传递方式问题

    Java支持两种基本的数据传递方式:值传递和引用传递。本文将详细介绍这两种传递方式,并通过具体的例子来说明它们的区别和应用。 #### 二、Java中的数据类型 Java中的数据类型分为两大类:原始类型(Primitive ...

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

    - **基本类型参数传递的误解**:有些人可能认为基本类型参数的传递也是引用传递,但实际上是值传递。这意味着在方法内对参数的修改不会影响到原始变量。 - **引用类型参数传递的误解**:虽然传递的是引用,但这并不...

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

    与基本类型不同,Java中的引用类型(如类、数组等)在参数传递时实际上是传递了对象的引用,而非对象本身。这意味着,如果在方法内部修改了对象的状态,则这种变化会影响到原始对象。 **示例**: 假设有一个表示...

    Java传递引用类型的实质_.docx

    Java中的参数传递机制是基于引用类型的,但这并不意味着在函数调用中,原始对象的引用会被改变。在Java中,所有非基本类型的变量实际上都是对象的引用,而不是对象本身。这意味着当你传递一个对象到方法中时,你实际...

    Java对象及其引用的理解

    本文将深入探讨Java中的对象、引用以及它们之间的关系,并结合值传递的概念进行解析。 首先,我们需要理解什么是Java对象。在Java中,对象是类的实例。当我们使用`new`关键字创建一个类的实例时,就创建了一个对象...

    浅谈Java中方法的参数传值.zip

    Java中,方法参数的传递主要有两种方式:值传递(Pass by Value)和引用传递(Pass by Reference)。不过,Java并没有真正的引用传递,而是通过对象引用来模拟引用传递的效果。下面我们详细讨论这两种方式。 2. 值...

    C、C++函数参数传递方式.pdf

    C和C++中的函数参数传递方式主要分为值传递、指针传递和引用传递。这些方式决定了参数在函数调用时的传值行为,以及它们在函数执行后是否能够影响原始数据。下面详细解释这些传递方式的知识点。 1. 值传递(Call by...

    Java传值还是引用

    值传递和引用传递的概念对于理解Java中的方法调用至关重要。基本类型参数的值在方法内部的任何修改都不会影响到方法外部的原始变量。而引用类型参数虽然看起来似乎可以修改外部变量,但实际上是通过修改对象的状态来...

    java中引用和c++中引用的区别.docx

    Java函数参数传递是按值传递的,这意味着当调用`fun(a)`时,实际上是复制了`a`的值(即对象的地址)给`x`。如果在函数内部修改`x`指向的对象,例如`x = new A(3)`,这不会影响到`a`和`b`,因为它们仍然指向原来的`A...

    java用JNA调用dll实例,包含各种参数调用

    你需要继承Struct类,定义成员变量并使用`Structure.ByValue`或`Structure.ByReference`来选择是值传递还是引用传递。 4. **结构体的指针和引用**:如果DLL函数需要结构体的指针,你可以创建一个指向Struct实例的...

    java 参数转换为matlab参数

    在Java和MATLAB之间的交互过程中,有时我们需要将Java程序中的数据传递给MATLAB环境,这就涉及到参数类型的转换。本文将详细讲解如何将Java参数转换为MATLAB可接受的参数,并提供一个源码实例来帮助理解这个过程。 ...

    Java传参方式-值传递还是引用传递

    这就是为什么说“对象是按引用传递的”,但参数传递机制仍然是按值传递。 考虑以下代码示例: ```java class Test { public static void main(String[] args) { StringBuffer s = new StringBuffer("good"); ...

Global site tag (gtag.js) - Google Analytics