java基础面向对象之引用传递
2017-02-15
引用传递的核心意义:
同一块堆内存空间可以被不同的栈内存所指向,不同栈内存可以对同一堆内存进行内容的修改。
引用传递例1:
1 class Nummer{ 2 private int num = 10 ; //设置num的值 3 public Nummer (int num){ //构造函数初始化num变量 4 this.num = num ; 5 } 6 public void setNum(int num){ 7 this.num = num ; 8 } 9 public int getNum(){ 10 return this.num ; 11 } 12 } 13 public class Demo1 { 14 public static void main(String[] args) { 15 Nummer n = new Nummer(30) ; 16 /** 17 * 声明并实例化Nummer类的对象 18 * 并且传递一个值30,修改原始值 19 */ 20 fun(n) ; //调用fun()方法,传入Nummer类的对象 21 System.out.println(n.getNum()); 22 } 23 public static void fun(Nummer temp){ 24 temp.setNum(100) ; //修改值30,变为100 25 } 26 }
内存分析图:
引用传递例2:
1 public class Demo2 { 2 public static void main(String[] args) { 3 String str = "hello" ; //声明一个string 类 型 的字符串 4 fun(str) ; //调用fun() 方法 5 System.out.println(str); //打印输出str 6 } 7 public static void fun(String st){ 8 st = "world" ; //修改str原始的值 9 /** 10 * 11 * 12 */ 13 } 14 }
误区:String类对象的内容一旦设置则不可改变,对象内容的改变依靠的是引用地址的改变。
内存分析图:
引用传递例3:
1 class D{ 2 private String msg = "nihaoa" ; 3 public D(String msg){ 4 this.msg = msg ; 5 } 6 public void setMsg(String msg){ 7 this.msg = msg ; 8 } 9 public String getMsg(){ 10 return this.msg ; 11 } 12 } 13 public class Demo3 { 14 public static void main(String[] args) { 15 D d = new D("Hello") ; 16 fun(d) ; 17 System.out.println(d.getMsg()); 18 } 19 public static void fun(D d){ 20 d.setMsg("你好") ; 21 } 22 }
内存分析图:
结论:
虽然String属于类,属于引用类型,但是由于其内容不可改变的特点很多的时候就直接把String当成基本类型,
也就是说String变量只可以保存一个数据,如果改变了之前的数据就没了