java基础面向对象之引用传递

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变量只可以保存一个数据,如果改变了之前的数据就没了 

原文地址:https://www.cnblogs.com/zbj815/p/6402804.html