java面向对象 【专题】引用传递
2014-10-14 18:34
676 查看
引用传递时整个java的精髓所在,其核心概念即:一块堆内存空间(保存对象的属性信息)可以被多个栈内存所共同指向,则每一个栈内存都可以修改同一块堆内存空间的属性值.
范例1:
以上程序实例化了per1的对象,而后分别为per1的对象name和age属性赋值,后又声明了per2的对象,但它指向的对象的内容为per1指向的堆内存空间地址,所以per1和per2指向同一堆内存空间,这样per2对属性的修改一定会影响到per1对象.
范例2:
以上程序在实例化对象的时候,同时为类中的data属性赋值为100,之后将此类对象传递给fun()方法,由于类本身属于引用数据类型,所以fun()方法中的修改直接影响原始对象的内容.
范例3:
以上的程序运行过程如下:str指向"hello"→将str所指向的地址传递给temp,所以temp也指向"hello"→声明新的字符串"world",temp改变指向,断开指向的"hello"转而指向"world"→str指向不变,方法执行完毕→temp消失,"world"成为垃圾→str的指向不变,仍为"hello".一定要注意的一点:字符串内容一旦声明不可改变!!!
范例4:
对于基本数据类型,其不牵扯到内存关系,传递时只是数值传递,不是内存传递,其特点为:方法里无论做何修改,都不会影响原数据内容.
范例5:
本程序运行过程如下:demo指向data的名字(即地址)(data的名字在栈,其字符串的内容在堆)→data指向存在于堆内存中的"hello"→temp指向data的名字(即地址)→开辟新的内存空间"world"→data断开对"hello"的指向,转而指向"world"→方法执行完毕,temp消失,"hello"成为垃圾.
范例1:
class Person{ String name ; int age ; public void tell(){ System.out.println("姓名:" + name +",年龄:" + age) ; } } public class Demo{ public static void main(String args[]){ Person per1 = new Person() ; per1.name = "张三" ; per1.age = 20 ; Person per2 = per1 ; per2.name = "李四" ; per1.tell() ; } }运行结果:
以上程序实例化了per1的对象,而后分别为per1的对象name和age属性赋值,后又声明了per2的对象,但它指向的对象的内容为per1指向的堆内存空间地址,所以per1和per2指向同一堆内存空间,这样per2对属性的修改一定会影响到per1对象.
范例2:
class Demo{ private int data = 10 ; public Demo(int data){ this.data = data ; } public void setData(int data){ this.data = data ; } public int getData(){ return this.data ; } } public class TestDemo{ public static void main(String args[]){ Demo demo = new Demo(100) ; fun(demo) ; System.out.println(demo.getData()) ; } public static void fun(Demo temp){ temp.setData(30) ; } }运行结果:
以上程序在实例化对象的时候,同时为类中的data属性赋值为100,之后将此类对象传递给fun()方法,由于类本身属于引用数据类型,所以fun()方法中的修改直接影响原始对象的内容.
范例3:
public class TestDemo{ public static void main(String args[]){ String str = "hello" ; fun(str) ; System.out.println(str) ; } public static void fun(String temp){ temp = "world" ; } }运行结果:
以上的程序运行过程如下:str指向"hello"→将str所指向的地址传递给temp,所以temp也指向"hello"→声明新的字符串"world",temp改变指向,断开指向的"hello"转而指向"world"→str指向不变,方法执行完毕→temp消失,"world"成为垃圾→str的指向不变,仍为"hello".一定要注意的一点:字符串内容一旦声明不可改变!!!
范例4:
对于基本数据类型,其不牵扯到内存关系,传递时只是数值传递,不是内存传递,其特点为:方法里无论做何修改,都不会影响原数据内容.
public class TestDemo{ public static void main(String args[]){ int data = 10 ; fun(data) ; System.out.println(data) ; } public static void fun(int temp){ temp = 20 ; } }运行结果:
范例5:
class Demo{ private String data ; public Demo(String data){ this.data = data ; } public void setData(String data){ this.data = data ; } public String getData(){ return this.data ; } } public class TestDemo{ public static void main(String args[]){ Demo demo = new Demo("hello") ; fun(demo) ; System.out.println(demo.getData()) ; } public static void fun(Demo temp){ temp.setData("world") ; } }运行结果:
本程序运行过程如下:demo指向data的名字(即地址)(data的名字在栈,其字符串的内容在堆)→data指向存在于堆内存中的"hello"→temp指向data的名字(即地址)→开辟新的内存空间"world"→data断开对"hello"的指向,转而指向"world"→方法执行完毕,temp消失,"hello"成为垃圾.
相关文章推荐
- Java-面向对象中引用传递和按值传递
- Java基础(极客)——11、Java面向对象中引用的传递
- Java面向对象基础--引用传递分析
- Java面向对象-方法的值传递和引用传递
- Java面向对象-方法的值传递和引用传递
- 12-8java面向对象对象之引用传递
- 有关java的引用传递,直接操作对象本身。直接删除BE的value中某值
- java传递是引用的拷贝,既不是引用本身,更不是对象
- java传递是引用的拷贝,既不是引用本身,更不是对象
- Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)
- 在java中String,对象,Integer(包装类型的)关于引用传递还是值传递
- Java 把对象作为参数传到一个方法里,这个是值传递还是引用传递, 为什么结果这么怪?
- JAVA引用和对象的关系_还有值传递
- java传递是引用的拷贝,既不是引用本身,更不是对象
- 【JSF心得】JAVA的对象传递是引用传递
- 在Java中方法参数的传递,对象是传递引用
- java面向对象--this关键字、引用变量、构造方法
- java传递是引用的拷贝,既不是引用本身,更不是对象
- Java函数传递对象与C++传递引用
- java面向对象设计最佳实践 专题 与 Java程序员应该掌握的10项技能