package property; public class ValueTest { private String field; public static void main(String[] args) { /* * * -----------------方法参数----------------- * * 按值调用:表示方法参数接受的是调用者提供的值 * 按引用调用:................................................提供的变量地址 * * Java是值传递 * * 对象引用和值引用 * * 对象引用是按照值传递的 * */ /* * 值引用 * * Java程序设计是按值引用,方法得到是所有参数值的一个拷贝,并不能修改传递给他的参数变量的内容 * * 执行步骤: * 1.x被初始化a的值的一个拷贝 * 2.x*5 =10 ,a的值仍是2 * 3.方法结束后x变量不再使用 */ int a = 2; method1(a); System.out.println("a=="+a); String b = "a"; method2(b); System.out.println("b=="+b); String c = new String(); c = "c"; method2(c); System.out.println("c=="+c); /* * String类型不是基本数据类型为什么不能改变值:新开辟一块内存 * String是final修饰的 * 先拷贝x的一份对象变量为y,方法内给拷贝变量赋值,赋值操作是新开辟一片内存空间,引用赋值给y,x的引用并没有改变 */ String x = "5"; method(x); System.out.println("x--->"+x); /* * 方法参数有两种类型: * 1.基本数据类型 * 2.对象引用 * * 一个方法不能修改一个基本数据类型的参数,下面看对象引用 */ /* * 对象引用 * * 1.拷贝一份va的值赋给x,这是对象引用,指向同一个对象 * 2.x.field="ss"; * 3.结束后x不再使用,va继续指向原来的对象,值改变 */ ValueTest va = new ValueTest(); va.setField("aa"); method3(va); System.out.println(va.getField()); /* * 1.分别拷贝一份对象变量赋值 * 2.x,y指向对象交换,但是v1,v2没变 * 3.结束后x,y不再使用了 */ ValueTest v1 = new ValueTest(); v1.setField("v1"); ValueTest v2 = new ValueTest(); v2.setField("v2"); method4(v1, v2); System.out.println(v1.getField()); System.out.println(v2.getField()); } private static void method(String y){ y= "6"; } private static void method1(int x){ x = 5*x; System.out.println("x=="+x); } private static void method2(String x){ x = "aaa"; System.out.println("x=="+x); } private static void method3(ValueTest x){ x.field = "ss"; System.out.println(x.getField()); } private static void method4(ValueTest x,ValueTest y){ ValueTest temp = y; y = x; x = temp; } public String getField() { return field; } public void setField(String field) { this.field = field; } }