问题的引入是因为下午在群里看到了一个网友的问题:
给定如下Java 代码,编译运行后,输出结果是( )。
public class Test {
public static void main(String [ ] args) {
StringBuffer a = new StringBuffer(“A”);
StringBuffer b = new StringBuffer(“B”);
operate(a , b);
System.out.println(a + ”,” + b);
}
static void operate(StringBuffer x , StringBuffer y) {
x.append(y);
y = x;
}
}
A. A,B B. AB,B C. A,AB D.AB,AB
朋友可以猜猜这个答案,我也想告诉大家,答案是:B。也许有人会很惊讶,也许有人会很淡定。因为StringBuffer是一个类,对于类的使用,通过new,在堆中创建一个类的实例,利用一个引用来实现对这个对象的操作。当把一个引用当作参数传递到一个函数中的时候,C++采取的是:这个参数是一个地址。而在java中没有地址这个概念,一切都是值传递,那么这里又是怎么控制的。
首先,我做了一个测试:
public class Text {
public static void main(String[] args) {
String s = "b";
f(s);
System.out.println(s);
}
static void f(String s) {
s = "c";
}
} /* output
b
*///~
从结果可以看出:形参的效果并没有作用到实参中。我们继续看下一段代码:
public class Text {
String s = "b";
public static void main(String[] args) {
Text t = new text();
f(t.s);
System.out.println(t.s);
}
static void f(String s) {
s = "c";
}
} /* output
b
*///~
这里的输出结果还是为b。继续:
public class Text {
String s = "b";
public static void main(String[] args) {
Txet t = new Text();
f(t);
System.out.println(t.s);
}
static void f(Text t) {
t.s = "c";
}
} /* output
c
*///~
从结果中可以看出:形参的效果作用到了实参,这里的引用发生了效果。
String为系统带的类,而Text为自定义的类,为了防止是自定义类跟系统类的影响,又使用了另外一个系统类List进行验证:
public class Text {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(33);
l(list);
System.out.println(list);
}
static void l(List<Integer> list) {
list.add(55);
}
} /* output
[33, 55]
*///~
从输出结果中可以看出:类的引用效果得以发挥。
针对上面的结果,我想朋友们会有一些意外,因为在java基础语言学习中,我们曾经对“==”与“equals()”的操作曾经进行了很多的讨论,结果说明:String类是一个引用类型,给出一段代码,以供大家学习:
public class SimpleTypeText {
public static void main(String[] args) {
String s1 = "a";
String s2 = "a";
String s3 = new String("b");
String s4 = new String("b");
System.out.println("s1 == s2 ? " + (s1 == s2) );
System.out.println("s1.equals(s2) ? " + s1.equals(s2));
System.out.println("s2 == s3 ? " + (s2 == s3) );
System.out.println("s2.equals(s3) ? " + s2.equals(s3));
System.out.println("s3 == s4 ? " + (s3 == s4) );
System.out.println("s3.equals(s4) ? " + s3.equals(s4));
(s4, s1);
}
static void f(String s) {
s = "a";
}
static void g(String s, String s1) {
s = "a";
System.out.println("通过常字符串:" + s == s1);
s = new String(s1);
System.out.println("通过new方法:" + s == s1);
}
} /*output:
s1 == s2 ? true
s1.equals(s2) ? true
s2 == s3 ? false
s3.equals(s3) ? true
s3 == s4 ? false
s3.equals(s4) ? true
通过常字符串:true
通过new方法:false
*///~
总结:
1. thinking in java 中对String类型对象有这样一段描述:
String对象是不可变的,没一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象。
对String类型的对象做参数有这样的一段描述:
每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未动过。
2. 在字符串的声明中,利用常字符串初始化的时候,系统会从已有的常字符串进行查找,如果存在此字符串常量,则不再生成新的字符串常量,但是new方法不是这样的,即它不进行查找,直接开辟一段新的空间,存储这个字符串。
声明:以上代码均为参考,希望对基础有些帮助。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yanmushi/archive/2010/05/09/5573022.aspx
分享到:
相关推荐
11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java...
13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....
58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递...
在本文中,我们将讨论 Java 方法参数传递中的引用类型传递。 在 Java 中,引用类型包括类、接口、数组等,都是对象的引用。这些引用类型在传递过程中,会将对象的引用传递给方法体内的变量,而不是对象的副本。因此...
Java参数传递机制是编程中的重要概念,尤其是在Java中,它对于理解如何在方法间操作数据至关重要。本PPT深入探讨了这一主题,旨在帮助学习者彻底理解Java中的参数传递方式。 首先,我们要回顾面向对象的基本概念。...
在Java中,有两种基本的参数传递方式:值传递和引用传递。值传递是将变量的副本传递给方法,而引用传递则是传递变量指向的对象引用。对于基本类型,Java总是使用值传递;而对于对象,实际上是引用的复制,但仍然保持...
在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java对象和C++数据类型的映射关系。在JNI中,Java的基本数据类型如`boolean`, `byte`, `char`, `short`, `int`, `float`, `...
Java参数传递机制是编程中非常重要的概念,它涉及到基本类型和引用类型的差异。在Java中,参数传递主要有两种方式:值传递(Value Passing)和引用传递(Reference Passing)。虽然Java官方文档并未明确提及引用传递...
java传递参数的方法 很的东西 大家下载学习一下
这里详细的说明了,java参数传递的过程,引用传递,值传递
总结一下,JNI 参数传递的关键点包括: 1. **类型映射**:Java 和 C++ 的数据类型不同,需要使用 JNI 提供的类型映射,如 `jint`、`jstring` 等。 2. **字段访问**:使用 JNI 的 `GetFieldID` 和 `GetObjectField`...
Java语言中参数传递的深入剖析 Java语言中参数传递的机制是一个复杂的主题,对于初学者来说,参数传递机制是一个难点。许多教材、论文和帮助手册对Java语言中参数传递的机制进行了探讨,但这些说法不一,有些模糊带...
java中参数传递的演示,分析传值与传引用的区别
#### 一、Java参数传递的基本概念 在Java中,方法(或称为函数)可以通过参数来接收外部的数据,并且能够返回处理后的结果。参数的传递方式主要有两种:值传递(Pass-by-value)和引用传递(Pass-by-reference)。...
62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递....
59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递....
Java中参数传递方式详解 Java 中参数传递方式详解是 Java 新手入门面临的一个经典的话题。本文意在终结这个话题,Java 中有说法:Java 里面参数传递都是按值传递,怎么理解这句话? 按值传递和按引用传递是来自 ...
Java 参数传递机制详解 Java 中的参数传递机制是一个经久不息的讨论...Java 参数传递机制详解,揭开了 Java 中的参数传递机制的奥秘,详细分析了基本类型和对象作为参数传递的机制,并揭开了对象作为参数传递的迷惑。
1. **直接传递数组:** 在Java中,当我们想要将一个数组作为参数传递给某个方法时,只需要在方法的参数列表中指定数组类型即可。 ```java public void someMethod(int[] array) { // 方法体 } ``` 上述代码...
通过上述分析,我们可以清楚地了解到Java中引用和函数参数传递的基本概念以及它们的具体应用。了解这些概念对于正确使用Java进行编程非常重要,尤其是在处理复杂的数据结构和对象交互时。希望本文能帮助读者更好地...