public static void main(String[] args) throws Exception { String str="aaaaaaaa"; change(str); System.out.println(str); } public static void change(String str){ str="bbbbbbb"; }
结果是aaaaa,而不是改变过的bbbbb.
解释:
对象是传引用(准确说应该是指针,Java 中没有C 意义上的引用),但是如果引用的是个String对象,情况就不同,因为String 一旦创建就不能改变,这才是关键(本质)。
在change 方法中给该方法的局部变量str 重新赋值时,因为str 指向的位置是String 常量池,是不能改变的,所以只能产生一个新的String 对象,change 方法中的str 指向新的对象,而main 方法中的str 变量还是指向之前产生的对象。
这跟一般的传引用是不一样的,因为一般的引用可以改变其指向的地址上的对象值,所以传来传去如果大家还是指向同一个地址,一改全部都改变了。
可以用StringBuffer 试试,结果和你预期的就会一致。如下面的代码
public static void main(String[] args) throws Exception { StringBuffer str=new StringBuffer("aaaaaaaa"); change(str); System.out.println(str); } public static void change(StringBuffer str){ str=str.replace(0, str.length(), "bbbbbbbb"); }
也就是说,如果修改了引用指向的地址的内容,所有指向该地址的引用都会受到影响,这才是传引用的根本所在。
使用String s="" 的方式产生的String 对象会被放入String 常量池中,而String 常量池中相同的String 对象只会有一个Copy ,故,public static void main(String[] args) throws Exception {
String str1="aaaaaaaa"; String str2="aaaaaaaa"; System.out.println(str1==str2); }
将输出true. 而使用new String 产生的对象就跟一般的对象一样,会在普通的Heap 中,此对象会同时被加入String常量池(不是很好验证),
public static void main(String[] args) throws Exception { String str1=new String("aaaaaaaa"); String str2=new String("aaaaaaaa"); System.out.println(str1==str2); }
将输出false.
相关推荐
"java中传值还是传引用的认识" Java 中的参数传递是值传递还是引用传递?这是一个经常引发讨论的问题。在 Java 中,参数传递是按值传递的,也就是说,传递给方法的参数是一个副本,而不是原始值本身。 当一个对象...
### Java是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。这意味着当你将一个简单类型的值作为参数传递给一个方法时,实际上传递的是这...
在Java中,类类型(如String、Model等)都是传引用的,函数内部对类类型参数的修改会影响原来的参数值。但是,需要注意的是,函数内部对类类型参数的修改只是修改了函数内部的参数的引用,而不是修改了原来的参数值...
总结来说,JavaScript中的变量处理基于数据类型的不同:不可变类型通过值的复制进行赋值和函数参数传递,而可变类型通过引用的复制进行。这种设计允许JavaScript在处理不同类型数据时更高效地管理内存,同时提供了...
二、 Java 中的“传值”和“传引用”问题 在 Java 中,基本类型作为参数传入方法时,方法操作的是参数变量的一个拷贝,而非变量本身。这叫做“值传递”。例如,在上面的代码示例中,我们将整数变量 `number` 传递给...
总的来说,Java的方法参数传递机制对基本类型采用传值,对象类型采用“传引用”的方式。理解这两种机制的不同可以帮助开发者编写更加安全和可维护的代码。在设计方法时,应根据需要决定是否需要修改对象的状态,以及...
将`this`作为参数传递给`ShowDialog()`方法,这样子窗体就能访问到父窗体的对象。 ```csharp FMChild fmChild = new FMChild(); fmChild.ShowDialog(this); fmChild.Dispose(); ``` **方法二**: 设置`Owner`属性...
JavaScript中的传值与传引用是理解函数参数传递的关键,它涉及到数据类型的处理方式。在JavaScript中,主要有两种数据类型:基本类型(Primitive Types)和引用类型(Reference Types)。基本类型包括undefined、...
总之,Java的参数传递机制结合了按值和按引用的特点,对于基本类型是按值传递,而对于对象则是按引用传递,但传递的是对象引用的副本。开发者需要根据具体情况灵活运用这一特性,以编写出高效、安全的代码。
### Java及C++中传值传递、引用传递和指针方式的理解 在程序设计语言中,函数调用时参数的传递方式对理解程序的行为至关重要。本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用...
即使传入方法的String参数被修改,也不会影响到原始的String实例,因为String对象在修改时会创建新的对象。例如: ```java public void modifyString(String str) { str += "world"; // 创建了新的String对象 } ...
### Java 类:传值还是传引用? 在Java编程语言中,理解变量的传递方式对于编写高效、可维护的代码至关重要。本文将通过一个具体的例子来深入探讨Java中的传值与传引用的区别,并解释如何利用这一特性来更好地管理...
在C#编程中,了解和区分传值与传址的概念至关重要,因为这直接影响到函数调用时参数的处理方式,从而影响程序的行为。下面通过两个示例来详细讲解这两个概念。 **传值(Pass by Value)** 在C#中,基本类型(如int...
这里涉及到了Java中的"传值"和"传引用"概念。对于基本类型(如int、char等),Java总是按值传递。这意味着当你把一个基本类型的变量传递给方法时,方法得到的是这个变量的一个副本,改变副本不会影响原始变量。在...
在VB(Visual Basic)编程中,参数的混合使用是一个...以上就是VB参数混合使用的详细解释,包括传值、传引用、默认参数、可变数量参数、数组参数以及类型转换。理解并熟练运用这些特性,能让你在VB编程中更加得心应手。
委托的声明通常包含方法的返回类型和参数列表,这使得我们可以确保只有与委托兼容的方法才能被赋值给它。 接下来,让我们看一个简单的委托定义例子: ```csharp public delegate void ValueTransfer(string value)...
Java中,当涉及到基本类型(如`int`, `double`等)的参数传递时,采用的是传值的方式。这意味着当一个基本类型的变量作为参数传递给方法时,实际上是传递了一个副本,而不是原始值本身。因此,即使在方法内部改变了...
Python函数的参数传值使用的是引用传值,也就是说传的是参数的内存地址值,因此在函数中改变参数的值,函数外也会改变。 这里需要注意的是如果传的参数类型是不可改变的,如String类型、元组类型,函数内如需改变...