您的位置:首页 > 编程语言 > Java开发

Java中对象调用机制

2016-02-01 20:01 531 查看
Java属于面向对象的编程语言,这也给大家造成了一定的误区,在此说明

java对对象采用的是值传递而非对象传递

也就是说,以对象作为参数的方法,只能修改对象的参数即内容,无法修改对象存储的位置

举个例子

public class SwapObject {

private static Person person1;
private static Person person2;

public static void main(String[] args) {

person1 = new Person("Angel", "22");
person2 = new Person("banan","44");
System.out.println("---打印出person1和person2的初始值---");
System.out.println("person1:"+person1+",person2"+person2);
System.out.println();
swap1(person1, person2);
System.out.println("---swap1方法结束后---");
System.out.println("person1:"+person1+",person2"+person2);
System.out.println();
swap2(person1, person2);
System.out.println("---swap2方法结束后---");
System.out.println("person1:"+person1+",person2"+person2);
}

/**
* 交换两个对象
* @param person1
* @param person2
*/
private static void swap1(Person person1,Person person2){
Person temp = person1;
person1 = person2;
person2 = temp;
System.out.println("---调用swap1方法内部---");
System.out.println("person1:"+person1+",person2"+person2);
System.out.println();
}

/**
* 交换两个对象的内容
* @param person1
* @param person2
*/
private static void swap2(Person person1,Person person2){
String tempName = person1.name;
String tempAge = person1.age;
person1.name = person2.name;
person1.age = person2.age;
person2.name = tempName;
person2.age = tempAge;
System.out.println("---调用swap2方法内部---");
System.out.println("person1:"+person1+",person2"+person2);
System.out.println();
}
}


上述代码的运行结果是:



可以看到,swap1方法没有实现两个对象的交换,而swap2方法实现了两个对象的交换,

原因如下:

过程分析:

1,首先new出来的对象

     person1指向的值为name=Angel,age=22

     person2指向的值为name=banan,age=44;

2,在调用swap1方法时,拷贝出了两个对象

     person1指向的值为name=Angel,age=22

     person2指向的值为name=banan,age=44;

    copyperson1指向的值为name=Angel,age=22

    copyperson2指向的值为name=banan,age=44;

3,在swap1方法内部进行了交换,即此时内部对象 的值为

     person1指向的值为name=Angel,age=22

     person2指向的值为name=banan,age=44;

    copyperson1指向的值为name=banan,age=44

    copyperson2指向的值为name=Angel,age=22;

    只是说被拷贝的对象进行了交换,但是并未改变原来的对象,     而在方法结束后,拷贝的对象被释放掉了

4,在调用swap2方法时,是说,对拷贝的对象所指向的值进行了更改,因为拷贝的对象和原来的对象所指向的为同一块存储区域,即执行swap2方法时存储区域里的内容发生了改变,也就是说原来的对象所指向的存储区域内容发生改变了,所以,swap2可以实现交换两个对象内容,但swap1却不可以,具体如下图所示





其实这是说明了java面向对象的机制,你在调用swap1时,只是简单的在栈里添加了一个对对象的引用,当方法结束后,所添加的引用跟着消失。而在调用swap2方法时是在修改对象的引用所指向的对象里的内容。

对于对象和对象引用的关系可参考

面试必备:String,StringBuffer,StringBuilder区别

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: