Java中没有指针,所以也没有引用传递了,仅仅有值传递 不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参
数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
结果:
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
Java参数按值传递
面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
1、基本类型的,是传值
2、对象类型的是传引用
3、特殊类型的,比如String,额外分析,String 比较特别,看过String 代码的都知道, String 是 final 的。所以值是不变的。 函数中String对象引用的副本指向了另外一个新String对象,而数组对象引用的副本没有改变,而是改变对象中数据的内容.。
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
for(int i=0; i<list.size();i++){
String str = list.get(0); 此处相值传递
str ="ddd";
}
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));
List<Map> list1 = new ArrayList<Map>();
Map map1 = new HashMap();
map1.put("ss", "DDD");
list1.add(map1);
list1.add(map1);
list1.add(map1);
for(int i=0; i<list1.size();i++){
Map ap = list1.get(0); //此处相当于引用传递
ap.put("cc", "FFF");
}
System.out.println(list1.get(0).get("cc"));
System.out.println(list1.get(1).get("cc"));
System.out.println(list1.get(2).get("cc"));
}
结果:
aaa
bbb
ccc
FFF
FFF
FFF