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

    黑马程序猿入学blog ...


    接着上一章的代码:

    //车类
    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.

    所以结果为;大众

  • 相关阅读:
    win7连接l2tp报错789“L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误”
    Django内置Admin
    python-django(day19)
    常用模块-day06
    生成器、内置函数、模块与包的使用、正则表达式-day05
    Python 函数对象、 名称空间与作用域、闭包、装饰器、迭代器
    python字符编码、文件处理、函数
    2018-06-19——考试周肝完的我又回来了
    2018-06-11——pthyon类型整理
    2018-06-10——python基础整理
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7355915.html
Copyright © 2011-2022 走看看