/**
* Created by kodulf on 2017/4/5.
*/
public class ZhiChuanDi {
/**
* 值传递,原来的值相当于是使用final修饰了,参数值可以随意修改
*
*
* 值传递,传递值,如果是基本数据类型,那么传递的就是数据的值,如果是引用数据类型,那么就是传递的地址
* 总体来说,默认传给参数的值是不会变的,但是参数里面的内容是会变的
* 这个就相当于是原来的值使用final 修饰了参数(一定要注意了,这里是原来的值),基本数据类型是不变的,但是应用数据类型的引用是不会变的,但是里面的内容是可以变的。
* 而方法里面的参数的值,如果你也想要它和原来的值一样,那么就也要使用final 来修饰(像是作用在方法里面的内部类(例如匿名内部类),如果要访问到方法里面的参数,那么该变量最好修饰为final的)
* 值传递的测试,需要测试3个方面:
* 1: 测试传递一个基本数据类型的
* 2: 测试传递一个String
* 3: 测试传递一个对象
*/
public static void main(String[] args){
PassTest passTest = new PassTest();
passTest.var = 100;
//测试传递一个基本数据类型
int num = 11;
passTest.changeNum(num);
System.out.println(num);
System.out.println("++++++++++++++++++++++++++++++++++++++++++");
//测试传递一个String
String s = "原文";
System.out.println("String的hashcode ="+s.hashCode());
passTest.changeString(s);
System.out.println("调用完change方法后的String的hashcode ="+s.hashCode());
System.out.println(s);
System.out.println("++++++++++++++++++++++++++++++++++++++++++");
//测试传递一个对象
System.out.println("调用changeObject 之前的对象的hashcode ="+passTest.hashCode());
changeObject(passTest);
System.out.println("调用changeObject 之后的对象的hashcode ="+passTest.hashCode());
System.out.println(passTest.var);
}
/**
* 传递一个对象
* @param passTest
*/
public static void changeObject(PassTest passTest){
System.out.println("changeObject 方法里面获取到的对象的hashcode ="+passTest.hashCode());
passTest.var = 0;
System.out.println("changeObject 方法里面改变了成员变量的之后的对象的hashcode ="+passTest.hashCode());
}
}
class PassTest{
int var = 88;
/**
* 改变一个基本数据类型的
* @param num
*/
public void changeNum(int num){
num = 99;
}
/**
* 值传递,传过来的是什么呢?
* String 传过来的是它在内存中的地址
* @param a
*/
public void changeString(String a){
System.out.println("方法中获取到的String的hashcode ="+a.hashCode());
a = new String("changedString");
System.out.println("方法中赋新值后的String的hashcode ="+a.hashCode());
}
}