zoukankan      html  css  js  c++  java
  • JAVA_SE基础——24.面向对象的内存分析

    接着上一章的代码:

    //车类
    class Car{
    	
    	//事物的公共属性使用成员变量描述。
    	String	name; //名字的属性
    
    	String	color; //颜色属性
    
    	int wheel;	//轮子数
    					
    	//事物的公共行为使用函数描述。
    	public void run(){
    		System.out.println(name+"飞快的跑起来啦...");
    	}
    }
    
    
    class Demo1{
    	public static void main(String[] args) {	
    		//使用了Car类声明了一c变量, c变量指向了一个车对象。
    		Car	c = new Car(); 
    		//设置车对象的属性值。
    		c.name = "BMW";
    		c.color = "白色";
    		c.wheel = 4;
    		//访问车对象的属性值
    		System.out.println("名字:"+ c.name+" 颜色:"+ c.color+" 轮子数:"+c.wheel);
    		c.run(); 
    	}
    }
    结果是:

    名字:BMW 颜色:白色 轮子数:4

    BMW飞快的跑起来了



    上面代码在内存中是怎么运行的呢?

    下面我来给大家分析下:


    c是局部变量

    1.先声明了c变量 分配在栈内存

    2.new Car  在堆内存创建了一个车对象  看看Car有那些成员属性,然后再给对象分配初始值,为name=null,color=null,wheel=0     (成员一旦创建,对象的成员变量也会马上分配默认的初始值)  然后把地址0x97赋给了c       c就指向了车的这个对象。

    3.

    c.name  就是c拿着地址找到车的对象   然后把name改成BMW.       

    c.color 就是c拿着地址找到车的对象   然后把color 改成白色.

    c.wheel 就是c拿着地址找到车的对象   然后把wheel改成4.



    下面再看个例子:

    //车类
    class Car{
    	//事物的公共属性使用成员变量描述。
    	String	name; //名字的属性
    
    	String	color; //颜色属性
    
    	int wheel;	//轮子数
    					
    	//事物的公共行为使用函数描述。
    	public void run(){
    		System.out.println(name+"飞快的跑起来啦...");
    	}
    }
    
    
    class Demo1{
    	public static void main(String[] args) {	
    		Car c1 = new Car(); 
    		Car c2 = new Car();
    		c1.name = "宝马";
    		c2.name = "大众";
    		System.out.println("名字:"+ c1.name);  
    	}
    }

    结果:名字:宝马

    
    

    看下图解释:

    1.先声明了c1变量 分配在栈内存

    2.new Car  在堆内存创建了一个车对象  看看Car有那些成员属性,然后再给对象分配初始值,为name=null,color=null,wheel=0    (成员一旦创建,对象的成员变量也会马上分配默认的初始值)  然后把地址0x97赋给了c1       c1就指向了车的这个对象。

    3.再声明了c2变量 分配在栈内存

    4.再new 一个 Car  在堆内存再创建了一个车对象  看看Car有那些成员属性,然后再给对象分配初始值,为name=null,color=null,wheel=0    (成员一旦创建,对象的成员变量也会马上分配默认的初始值)  然后把地址0x67赋给了c2       c2就指向了车的这个对象。

    5.           c1.name  就是c1拿着地址找到车的对象   然后把name改成" 宝马 "    

    6.           c2.name  就是c2拿着地址找到车的对象   然后把name改成“ 大众 ”

    7.            最后输出c1.name            c1就拿着地址找到对应的对象  输出了那个对象的name  

    所以结果是:宝马

    下面再把这个例子改下:

    //车类
    class Car{
    	
    	//事物的公共属性使用成员变量描述。
    	String	name; //名字的属性
    
    	String	color; //颜色属性
    
    	int wheel;	//轮子数
    					
    	//事物的公共行为使用函数描述。
    	public void run(){
    		System.out.println(name+"飞快的跑起来啦...");
    	}
    }
    
    
    class Demo1{
    	public static void main(String[] args){	
    		Car c1 = new Car(); 
    		c1.name = "宝马";
    		Car c2 = new Car();
    		c2.name = "大众";
    		c1 = c2; 
    		System.out.println("名字:"+ c1.name);
    	}
    }
    结果:大众

    下图解释:


    1.先声明了c1变量 分配在栈内存

    2.new Car  在堆内存创建了一个车对象  看看Car有那些成员属性,然后再给对象分配初始值,为name=null,color=null,wheel=0    (成员一旦创建,对象的成员变量也会马上分配默认的初始值)  然后把地址0x97赋给了c1       c1就指向了车的这个对象。

    3.           c1.name  就是c1拿着地址找到车的对象   然后把name改成" 宝马 "  

    4.再声明了c2变量 分配在栈内存  

    5.再new 一个 Car  在堆内存再创建了一个车对象  看看Car有那些成员属性,然后再给对象分配初始值,为name=null,color=null,wheel=0    (成员一旦创建,对象的成员变量也会马上分配默认的初始值)  然后把地址0x67赋给了c2       c2就指向了车的这个对象。

    6.           c2.name  就是c2拿着地址找到车的对象   然后把name改成“ 大众 ”

    7.把c2的持有地址赋给了c1       c1的地址原来是0x97 改为 0x67    

    8.  最后输出c1.name         c1拿着改后的地址去找地址为0x67的对象        输出为0x67地址的对象中的属性name.

    所以结果为;大众

  • 相关阅读:
    用C#新建网站的方法
    zhngutils.js
    jQuery源代码学习jQuery对象构建
    前端性能书单
    预则成,不预则废
    表格
    js延时周期执行setTimeout;setInterval;clearTimeout;clearInterval
    url备份
    前端性能集合(各种测试各种资源...)
    Scrum开发模式
  • 原文地址:https://www.cnblogs.com/Jhaiha0/p/8465320.html
Copyright © 2011-2022 走看看