JAVA_传值与传地址

赋值原则:

Java中只有传值,不传对象。传值意味着当参数被传递给一个方法或者函数时,方法或者函数接收到的是原始值的副本。因此,如果方法或者函数修改了参数,受影响的只是副本,原始值保持不变。
当传递的是对象的名字或引用时,如果在方法中修改被引用对象的内容,这个改变会影响到原来的对象,因为此时不但对象的名字变了,对象的内容也变了。而传递的如果是原始类型则不会有影响。

方法调用时的参数传递原则

如果形式参数的数据类型是基本数据类型,则实际参数向形式参数传递的是值的副本;如果形式参数的数据类型是引用数据类型,则实际参数向形式参数传递的是引用值或地址值或对象的名字而不是对象本身。

例1:

class Flower {public String color;public String name;public int age;public void setAttribute(String c,String n) {this.color=c;this.name=n;}
}//引用类型的数据更改会带来哪些影响?
public class FlowerTest1 {public static void main(String[] args) {Flower aFlower=new Flower();aFlower.setAttribute("red", "rose");aFlower.age=10;System.out.println(aFlower.name+"'s color is "+aFlower.color+" and the age is "+aFlower.age);Flower aFlower2=aFlower;aFlower2.color="yellow";//引用类型数据的更改,将影响到原来的对象aFlower2.age=12;//引用类型数据的属性值更改,将影响到原来的对象的属性值System.out.println(aFlower.name+"'s color is "+aFlower.color+" and the age is "+aFlower.age);change(aFlower);//引用类型数据的更改,将影响到原来的对象System.out.println(aFlower.name+"'s color is "+aFlower.color+" and the age is "+aFlower.age);System.out.println(aFlower2.name+"'s color is "+aFlower2.color+" and the age is "+aFlower.age);//Test.main(args);//静态方法可以直接调用,无需声明实例对象}public static void change(Flower mFlower) {//引用类型数据的更改,将影响到原来的对象mFlower.color="blue";}
}

结果:
rose’s color is red and the age is 10
rose’s color is yellow and the age is 12
rose’s color is blue and the age is 12
rose’s color is blue and the age is 12

分析:
aFlower2作为aFlower的引用,拥有对aFlower的属性操作权,所以,对aFlower2的成员作出改变,aFlower的成员也会相应的改变.
方法public static void change(Flower mFlower)由于传递的是aFlower的引用,故调用aFlower2的change函数可以对aFlower作出相应的改变.
参考模型如下图:

例2

//引用类型的数据与基本数据类型的更改
public class Change {public static void main(String[] args) {StringBuffer a = new StringBuffer("ok");int i=5;System.out.println("Before change, a is "+a);change(a);System.out.println("After change, a is "+a);System.out.println("Before change, i is "+i);change(i);System.out.println("After change, i is "+i);}public static void change(StringBuffer ia) {//引用类型数据的更改,将影响到原来的对象ia.append(" ok?");}public static void change(int li) {//基本类型数据的更改,将不会影响到原来的对象li=10;}
}

结果:
Before change, a is ok
After change, a is ok ok?
Before change, i is 5
After change, i is 5

分析:
StringBuffer是java内置的类,故其实例对象应是引用数据类型,第一个change函数,形参是引用型数据类型,故在方法change中修改被引用对象a的内容,这个改变会影响到原对象a.
第二个change函数,形参是基本数据类型,对其传值整形i意味着当参数被传递该方法时,change方法接收到的是原始值i的副本,该方法对整形i重新赋值只会影响到i的副本,并不会影响到原整形i的值.

JAVA_传值与传地址

赋值原则:

Java中只有传值,不传对象。传值意味着当参数被传递给一个方法或者函数时,方法或者函数接收到的是原始值的副本。因此,如果方法或者函数修改了参数,受影响的只是副本,原始值保持不变。
当传递的是对象的名字或引用时,如果在方法中修改被引用对象的内容,这个改变会影响到原来的对象,因为此时不但对象的名字变了,对象的内容也变了。而传递的如果是原始类型则不会有影响。

方法调用时的参数传递原则

如果形式参数的数据类型是基本数据类型,则实际参数向形式参数传递的是值的副本;如果形式参数的数据类型是引用数据类型,则实际参数向形式参数传递的是引用值或地址值或对象的名字而不是对象本身。

例1:

class Flower {public String color;public String name;public int age;public void setAttribute(String c,String n) {this.color=c;this.name=n;}
}//引用类型的数据更改会带来哪些影响?
public class FlowerTest1 {public static void main(String[] args) {Flower aFlower=new Flower();aFlower.setAttribute("red", "rose");aFlower.age=10;System.out.println(aFlower.name+"'s color is "+aFlower.color+" and the age is "+aFlower.age);Flower aFlower2=aFlower;aFlower2.color="yellow";//引用类型数据的更改,将影响到原来的对象aFlower2.age=12;//引用类型数据的属性值更改,将影响到原来的对象的属性值System.out.println(aFlower.name+"'s color is "+aFlower.color+" and the age is "+aFlower.age);change(aFlower);//引用类型数据的更改,将影响到原来的对象System.out.println(aFlower.name+"'s color is "+aFlower.color+" and the age is "+aFlower.age);System.out.println(aFlower2.name+"'s color is "+aFlower2.color+" and the age is "+aFlower.age);//Test.main(args);//静态方法可以直接调用,无需声明实例对象}public static void change(Flower mFlower) {//引用类型数据的更改,将影响到原来的对象mFlower.color="blue";}
}

结果:
rose’s color is red and the age is 10
rose’s color is yellow and the age is 12
rose’s color is blue and the age is 12
rose’s color is blue and the age is 12

分析:
aFlower2作为aFlower的引用,拥有对aFlower的属性操作权,所以,对aFlower2的成员作出改变,aFlower的成员也会相应的改变.
方法public static void change(Flower mFlower)由于传递的是aFlower的引用,故调用aFlower2的change函数可以对aFlower作出相应的改变.
参考模型如下图:

例2

//引用类型的数据与基本数据类型的更改
public class Change {public static void main(String[] args) {StringBuffer a = new StringBuffer("ok");int i=5;System.out.println("Before change, a is "+a);change(a);System.out.println("After change, a is "+a);System.out.println("Before change, i is "+i);change(i);System.out.println("After change, i is "+i);}public static void change(StringBuffer ia) {//引用类型数据的更改,将影响到原来的对象ia.append(" ok?");}public static void change(int li) {//基本类型数据的更改,将不会影响到原来的对象li=10;}
}

结果:
Before change, a is ok
After change, a is ok ok?
Before change, i is 5
After change, i is 5

分析:
StringBuffer是java内置的类,故其实例对象应是引用数据类型,第一个change函数,形参是引用型数据类型,故在方法change中修改被引用对象a的内容,这个改变会影响到原对象a.
第二个change函数,形参是基本数据类型,对其传值整形i意味着当参数被传递该方法时,change方法接收到的是原始值i的副本,该方法对整形i重新赋值只会影响到i的副本,并不会影响到原整形i的值.