• 类与对象(二)----对象详解


    如何创建对象

    第一种方法:
    先声明 再创建
    Cat xiaobai ;//声明
    xiaobai = new Cat();//分配空间
    第二种方法:
    声明创建一步到位
    Cat xiaobai = new Cat();

    如何访问对象的属性

    当对象创建完毕斌且赋值后,在其他地方想要调用对象的属性需使用 对象名.属性名
    列如:
    xiaobai.name \xiaobai.age
    (对象名+.+属性名)

    类和对象的内存分配机制

    现有以下代码:
    Cat cat1 = new Cat();
    cat1.name = “小明”;
    cat1.age = 14;
    Cat cat2 = cat1;
    System.out.println(cat2.age);
    最终输出的是14;
    那么在内存中发生以下事情
    由于上方是引用传递,跟数组一致,所以cat2指向的地址跟cat1是一样的对象
    1- Cat cat1 = new Cat();
    (1)在方法区加载了Cat类及属性信息和方法信息
    (2)在栈创建了对象名cat1 在堆中创建了对象的空间里面有属性的默认值 并且把这个空间的地址给到cat1
    在这里插入图片描述

    2-cat1.name = “小明”;
    cat1.age = 14;
    Cat cat2 = cat1;
    System.out.println(cat2.age);
    (1)给cat1的属性进行赋值
    (2)把cat1指向的地址复制一份给cat2
    (3)输出cat2指向地址的成员变量
    在这里插入图片描述
    所以最终cat2输出的也是14

    如果下面再增加这么一行
    cat2.age =2;
    System.out.println(cat1.age);
    那么再输出就是 2 因为指向的空间是相同的 所以用cat2.age更改成员变量 用另一个对象名访问也是更改后的。

    总结

    java内存结构分析
    -存放基本数据类型(局部变量)
    -存放对象,数组等
    方法区-存放常量池,类加载信息

    java创建对象的流程

    Cat cat1 = new Cat();
    cat1.name = "小明";
    cat1.age = 14
    • 1
    • 2
    • 3

    1-加载类信息(属性信息 方法信息)
    2-在堆中分配空间,并进行默认初始化
    3-将堆中空间的地址赋给cat1 ,也就是在栈中的对象名
    4-进行自定义赋值

    细节

    分析以下代码会输出什么
    Cat cat1 = new Cat();
    cat1.name = “小明”;
    cat1.age = 14;
    Cat cat2 = cat1;
    System.out.println(cat2.age);//输出14
    cat2.age = 23;//更改了空间的age变量
    System.out.println(cat1.age);//输出23
    cat2=null;//清空cat2的地址,此时cat2不指向任何地方
    System.out.println(cat2.age);//曝出异常
    当cat2=null;在内存中cat2就断开了指向内存空间的对象,因此他就没有任何属性可以输出了
    在内存中表示为:
    在这里插入图片描述

  • 相关阅读:
    14.(地图数据篇)arcgis地图瓦片数据获取--java代码
    Redis:2023年的必修课,不学就要被市场淘汰
    罗景:连接效率优化实践
    vue3组件外使用route
    中国地质大学许少辉著《乡村振兴战略下传统村落文化旅游设计》图书馆荐购辉少许
    C++ STL容器底层实现原理
    vue基础知识八:为什么data属性是一个函数而不是一个对象?
    2023.10.19 关于设计模式 —— 单例模式
    Springboot之Actuator信息泄露漏洞利用
    经验分析:数据可视化工具入门讲解,如何应用数据可视化
  • 原文地址:https://blog.csdn.net/WINorYU/article/details/126544879