今天被问到一个问题,什么情况下java参数的传递为值传递,什么情况为引用传递,回答是基本数据类型如 int, float, double等为值传递,对象形式的参数为引用传递,这个回答被人给反驳了,理由是String 也是对象,为什么是值传递呢? 无语,这个我真不知道。
于是我把值传递与引用传递的几种情况做了个例子,尽量做得最简单。
1) 自定义对角的传递。
public class Test {
@SuppressWarnings("unchecked")
public Test()
{
Catalog catalog =new Catalog();
catalog.setId(1L);
catalog.setName("食品");
catalog.setShortname("工业基");
catalog.setTpl("ttp");
catalog.setFoods(new LinkedHashSet());
System.out.println(TypeUtil.typeToString("catalog", saveCatalog(catalog)));
}
private void initDefValue(Catalog catalog) {
catalog.setId(2L);
catalog.setName("FOOFOO");
}
public Catalog saveCatalog(Catalog catalog)
{
initDefValue(catalog);
return catalog;
}
public static void main(String[]arg)
{
Test test =new Test();
}
}
运行结果为:
catalog.id: 2
catalog.name: FOOFOO
catalog.shortname: 工业基
catalog.tpl: ttp
catalog.foods[]: empty
1) java对角的传递。
public class Test2 {
public Test2()
{
Set<Catalog> catalogSet =new LinkedHashSet<Catalog>();
Catalog catalog =new Catalog();
catalog.setId(1L);
catalog.setName("食品");
catalog.setShortname("工业基");
catalog.setTpl("ttp");
catalog.setFoods(new LinkedHashSet());
catalogSet.add(catalog);
changeSet(catalogSet);
System.out.println(TypeUtil.typeToString("Set",catalogSet));
}
public void changeSet(Set<Catalog> catalogSet)
{
Catalog catalog2 =new Catalog();
catalog2.setId(1L);
catalog2.setName("水果");
catalog2.setShortname("食品基");
catalog2.setTpl("ccf");
catalog2.setFoods(new LinkedHashSet());
catalogSet.add(catalog2);
}
public static void main(String[] args) {
Test2 test2 =new Test2();
}
}
运行结果为:
Set[0].id: 1
Set[0].name: 食品
Set[0].shortname: 工业基
Set[0].tpl: ttp
Set[0].foods[]: empty
Set[1].id: 1
Set[1].name: 水果
Set[1].shortname: 食品基
Set[1].tpl: ccf
Set[1].foods[]: empty
1) String与int 的传递。
public class Test3 {
public Test3()
{
String str =new String("99990");
int num =999;
changeValue(str,num);
System.out.println(str);
System.out.println(num);
}
public void changeValue(String str,int num)
{
str ="111111";
num=20;
}
public static void main(String[] args) {
Test3 test3 =new Test3();
}
}
运行结果为:
99990
999
结果正如人家反驳的那样子,于是把String类拿出来看了下子, 顶上面就有注释。
写道
/**
* The <code>String</code> class represents character strings. All
* string literals in Java programs, such as <code>"abc"</code>, are
* implemented as instances of this class.
* <p>
* Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
* Because String objects are immutable (永远不变的)they can be shared. For example:
* <p><blockquote><pre>
* String str = "abc";
* </pre></blockquote><p>
* is equivalent to:
* <p><blockquote><pre>
* char data[] = {'a', 'b', 'c'};
* String str = new String(data);
* </pre></blockquote><p>
* Here are some more examples of how strings can be used:
* <p><blockquote><pre>
* System.out.println("abc");
* String cde = "cde";
* System.out.println("abc" + cde);
* String c = "abc".substring(2,3);
* String d = cde.substring(1, 2);
* </pre></blockquote>
* <p>
* The class <code>String</code> includes methods for examining
* individual characters of the sequence, for comparing strings, for
* searching strings, for extracting substrings, and for creating a
* copy of a string with all characters translated to uppercase or to
* lowercase. Case mapping is based on the Unicode Standard version
* specified by the {@link java.lang.Character Character} class.
* <p>
* The Java language provides special support for the string
* concatenation operator ( + ), and for conversion of
* other objects to strings. String concatenation is implemented
* through the <code>StringBuilder</code>(or <code>StringBuffer</code>)
* class and its <code>append</code> method.
* String conversions are implemented through the method
* <code>toString</code>, defined by <code>Object</code> and
* inherited by all classes in Java. For additional information on
* string concatenation and conversion, see Gosling, Joy, and Steele,
* <i>The Java Language Specification</i>.
*
* <p> Unless otherwise noted, passing a <tt>null</tt> argument to a constructor
* or method in this class will cause a {@link NullPointerException} to be
* thrown.
*
* <p>A <code>String</code> represents a string in the UTF-16 format
* in which <em>supplementary characters</em> are represented by <em>surrogate
* pairs</em> (see the section <a href="Character.html#unicode">Unicode
* Character Representations</a> in the <code>Character</code> class for
* more information).
* Index values refer to <code>char</code> code units, so a supplementary
* character uses two positions in a <code>String</code>.
* <p>The <code>String</code> class provides methods for dealing with
* Unicode code points (i.e., characters), in addition to those for
* dealing with Unicode code units (i.e., <code>char</code> values).
*
* @author Lee Boynton
* @author Arthur van Hoff
* @version 1.205, 02/26/09
* @see java.lang.Object#toString()
* @see java.lang.StringBuffer
* @see java.lang.StringBuilder
* @see java.nio.charset.Charset
* @since JDK1.0
*/
是不是可以这样理解, String类是final的, 所以与Integer,Byte,Long,Double等等一样不能改变,每次改变都是创建新对象,或是直接赋的常量值,它们可以用做类来使用,但在传参是是值传递。
分享到:
相关推荐
这里详细的说明了,java参数传递的过程,引用传递,值传递
这个在Java里面是经常被提起的问题,也有一些争论,似乎最后还有一个所谓的结论:“在Java里面参数传递都是按值传递”。事实上,这很容易让人迷惑,下面先分别看看什么是按值传递,什么是按引用传递,只要能正确理解...
关于Java参数传递的PPT,详细介绍参数传递的类型。彻底理解Java只有唯一传递方式——值传递。
12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值...
Java语言中参数值传递和引用传递比较
我们先看一下值传递和引用传递的概念和区别 值传递:是指在调用函数时将实际参数复制一份传递到函数中,...我们通过例子理解一下Java的值传递: public static void main(String[] args) { int a = 10; int b = 20;
java参数传递时到底是值传递还是引用传递分享.pdf
不管是按值传递还是按引用传递,都是把栈中的数据备份了一份给参数变量,只不过值类型备份的是具体的数值,而引用类型备份的是内存地址
java的参数传递对比,体现了值传递和引用传递的区别,是我在java入门是写的学习demo
java参数传递时到底是值传递还是引用传递[归类].pdf
当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。 值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值 引用传递的特点:方法内部对传...
问题定位结果: 遇到&时,该参数的值会自动截断,导致参数值传递有误。 二、问题的解决 java代码中做如下测试: String charEncode = java.net.URLEncoder.encode(“&”); System.out.println(“字符& 转译后的值为...
lotus domino java代理_获取传递值json
主要介绍了JAVA参数传递方式,结合实例形式分析了java按值传递与引用传递区别及相关操作注意事项,需要的朋友可以参考下
主要介绍了Java参数传递及值传递实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
简单webview嵌套html文件,原生和js互相调用方法,互相传递参数并打印都页面上
数组总结(概念、定义、默认值、可变长参数、值传递与引用传递等)。1.冒泡排序: 两两相比(两个相邻的数进行比较) 条件成立 互换位置 外层循环控制比较的轮数 **轮数永远是 长度 -1 (n - 1)** 内层循环...
方法的值传递 目录 课程导入 理解方法调用时参数的顺序匹配 理解方法调用时值传递 方法调用时,需要提供实参,它们必须与方法签名中所对应的形参次序相同,这称作参数顺序匹配。 参数顺序匹配 public static void ...
在传统的观念里,都认为JavaScript函数传递的是引用传递(也称之为指针传递),也有人认为是值传递和引用传递都具备。那么JS的参数传递到底是怎么回事呢?事实上以下的演示也完全可以用于Java 首先来一个比较简单的,...
1. 对OGNL操作进行封装,完成OGNL表达式所表示的值到Java对象的值传递机制 2. 在参数传递的过程中,做恰当的类型转化,保证页面上的字符串能够转化成各 式各样的Java对象 接下来,通过四个不同的角度,来具体讲述...