java有没有引用传递?
很多书上说,java只有值传递,所以没有引用传递,这句话是对的么?
上代码
例一:
public class StringTest {
public int i=1;
public static void st(StringTest st){
st.i=10;
}
public static void main(String args[]){
StringTest st=new StringTest();
st(st);
System.out.println(st.i);
//输出:10
}
}
输出的时10,不是1,这说明这个对象传递的是引用而不是值。
这么说java是有引用传递的,那为什么那么多人还说java只有值传递呢?
在网上找了很久,最终发现,网上有人总结了如下4点:(我觉得可以说清楚了)
1、对象是按引用传递的 (这里的传对象其实也是传值,因为对象就是一个指 针,这个赋值是指针之间的赋值,因此在java中就将它说成了传引用。(引用是什么?不就是地址吗?地址是什么,不过就是一个整数值) )
2、Java 应用程序有且仅有的一种参数传递机制,即按值传递
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本
在网上找了很久,
对于1肯能有点困惑,看例子
例二:
public class StringTest {
public int i=1;
public StringTest(int i){
this.i=i;
}
public static void st(int in,StringTest st1,StringTest st2){
in=1;
st1.i=10;
st2=st1; //1
st2.i=20; //2
}
public String toString(){
return String.valueOf(i);
}
public static void main(String args[]){
StringTest st1=new StringTest(1);
StringTest st2=new StringTest(2);
int in=0;
st(in,st1,st2);
System.out.println(in);//输出:0 这说明他是传值,而不是传址(引用)
System.out.println(st1);//输出:10
System.out.println(st2);//我们发现无论是否注释掉位置2那一行,其输出:2 这里为什么是2呢?我们知道参数st2其实传递的是内存地址,而当把st1赋值个st2,其实改变的时st2这个变量的引用地址,因此当前的st2是没有变化的
//输出:10
}
}
这也证实了,java中只有值传递而没有引用传递这么说也是对的
关于string的问题
今天我朋友问我,String是引用类型还是值类型?
string是对象,按照如上4条规则,那他应该是引用传递(引用类型)了,可又人说他特殊,不是引用传递(值类型),是值传递
上例子吧
例三:
public class StringTest {
public int i=1;
public static void st(String st){
// System.out.println("st()方法中st的hashcode"+st.hashCode()); //1
st="bb";
}
public static void main(String args[]){
String st="aa";
// System.out.println("st的hashcode"+st.hashCode()); //2
st(st);
System.out.println(st);
/**
* 输出:aa 有人说从此例中可以看出string是值传递,我觉得这个有相当大的争议 首先string是一个对象,那么他传递的是应该是引用,
* 可这个例子证明了却相反,为什么?
* st是一个变量,传进去的当然是st这个变量所引用的(一个整数型id)内存地址,如何证明呢
* 我们吧 1和2这两行取消注释,你回发现,二者还是同一个hashcode
* 那为什么我改变了st在main方法中他还是那个了,其实这和 例二 中讲的原因是一样的,因为你 改变了变量的引用,二不是给引用的本身
*
*/
}
}
如果可以改变String中的变量的话,我想可以更好的证实这一点,但String对象是不可改变的,看他得源代码
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
可以看出String对象里的变量是不可改变的,那么也就是说String对象是不可改变的
注:本文参考了http://www.zxbc.cn/html/20081016/66711.html
分享到:
相关推荐
### Java中的按值传递与按引用传递详解 #### 一、引言 在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点...
因此,尽管看似是引用传递,但对`String`类型的处理结果与值传递类似。 总结来说,Java中的参数传递主要有以下特点: 1. 基本数据类型按值传递,函数内部无法改变实际参数的值。 2. 引用类型看似按引用传递,实际上...
62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递....
在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...
通过具体实例,我们将揭示值类型与引用类型之间的差异,并解释在实际编程过程中可能遇到的一些常见困惑。 #### 二、Java的数据类型 Java语言支持两种主要的数据类型:**值类型**和**引用类型**。值类型主要包括基本...
而引用类型的传递属于引用传递,例如在函数体内部对参数的操作会影响原始变量的值。 在 Java 中,引用类型的变量在声明后必须通过实例化开辟数据空间,才能对变量所指向的对象进行访问。例如 MyDate today = new ...
基础类型的参数传递是值传递,而对象等复合类型的参数传递是引用传递。理解这两种方式的区别是非常重要的,以便正确地使用参数传递,避免程序中的错误。 值传递和引用传递的区别可以用一个简单的例子来解释:值传递...
### 值传递和引用传递详解 #### 一、引言 ...对于Java而言,基本类型的参数传递采用值传递的方式,而对象类型的参数传递采用的是引用传递的方式。理解这些基础知识有助于编写更高效、更可靠的代码。
总的来说,理解Java中的值传递和对象引用传递对于编写高效、无误的代码至关重要。无论是基本类型还是对象类型,参数传递都是以值的形式进行,但对象类型的值是其引用,允许我们在方法内修改对象的状态,而不影响方法...
java学习java语言的值传递和引用传递
Java中的参数传递方式主要有两种:值传递和引用传递。理解这两种机制是编程中至关重要的,因为它们直接影响到函数内部如何改变或操作传入的数据。 **值传递**在Java中是基本数据类型(如int, double, char等)的...
13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....
当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。 值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值 引用传递的特点:方法内部对传...
Java编程语言中有两种参数传递方式:按值传递和按引用传递。理解这两种方式对于编写高效、无误的代码至关重要。 1. **按值传递(Pass by Value)** - Java中的基本类型(如int, double, char等)是按值传递的。这...
Java 语言中参数值传递和引用传递比较 Java 语言中参数值传递和引用传递是两种不同的参数传递方式,它们在 Java 编程中扮演着重要的角色。参数值传递是指将实际参数的值复制给形式参数,形式参数的变化不影响实际...
### Java引用变量传递诡异之处详解 #### 背景与问题描述 在Java编程语言中,对于引用类型变量的理解及其实现方式一直是开发者们容易混淆的地方。尤其是当涉及到方法调用过程中引用变量的传递时,更是如此。本文将...