[Java基础]面向对象-内存解析

news2024/11/26 10:00:31

因为内存解析篇幅较长,我们单独拿出来讲解。

我们知道,方法执行,其实就对内存的操作,但具体是如何进行的呢?下面我们以生成“圆”为例,从内存的角度解析程序执行过程。

/**
* 圆
**/
public class Circle {
    private CirclePoint o; // 圆心
    private double radius; // 半径

    public CirclePoint getO() {
        return o;
    }

    public void setO(double i, double j) {
        o.setX(i);
        o.setY(j);
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public double getArea() {
        return 3.14 * radius * radius;
    }

    // 无参构造函数
    Circle(CirclePoint o, double r) {
        this.o = o;
        this.radius = r;
    }

    // 自定义初始值的构造函数
    Circle(double r) {
        o = new CirclePoint(0, 0);
        radius = r;
    }

    Circle() {
    }
}
/**
* 圆心
**/
class CirclePoint {
    private double x;
    private double y;

    CirclePoint() {
    }

    CirclePoint(double x1, double y1) {
        this.x = x1;
        this.y = y1;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public void setX(double x) {
        this.x = x;
    }

    public void setY(double y) {
        this.y = y;
    }
}
/**
* test
**/
class TestCircle {
    public static void main(String[] args) {
        Circle c1 = new Circle(new CirclePoint(1.0, 2.0), 2.0); // 1
        Circle c2 = new Circle(5.0); // 2
        System.out.println("c1:(" + c1.getO().getX() + "," + c1.getO().getY() + ")," + c1.getRadius()); // 3
        System.out.println("c2:(" + c2.getO().getX() + "," + c2.getO().getY() + ")," + c2.getRadius()); // 4
        System.out.println("c1 area = " + c1.getArea()); // 5
        System.out.println("c2 area = " + c2.getArea()); // 6

        c1.setO(5, 6); // 7
        c2.setRadius(9.0); // 8

        System.out.println("c1:(" + c1.getO().getX() + "," + c1.getO().getY() + ")," + c1.getRadius());   // 9
        System.out.println("c2:(" + c2.getO().getX() + "," + c2.getO().getY() + ")," + c2.getRadius());   // 10
        System.out.println("c1 area = " + c1.getArea());  // 11
        System.out.println("c2 area = " + c2.getArea());  // 12

    }
}

步骤1执行过程:

Circle c1 = new Circle(new CirclePoint(1.0, 2.0), 2.0);

局部变量赋值给堆内存中的对象

   

构造函数结束,局部变量消失

我们整理一下,步骤1执行结束后,内存中的分布是:

按照同样的分析思路,步骤2执行完,内存的情况是(过程省略):

接下来我们看下步骤3的执行过程:

System.out.println("c1:(" + c1.getO().getX() + "," + c1.getO().getY() + ")," + c1.getRadius());

步骤3,考察点:方法的返回值在栈中也会占一部分空间;

我们还是按照从里向外,从左到右的步骤分析:

"c1:("  :是字符串常量,存在字符串常量池中;

 同理,println方法执行结束后,栈中的内存被释放

 同理可分析步骤4,5,6;

接下来我们分析下步骤7:

c1.setO(5, 6);

 同理,可分析步骤8,为C2赋值。

步骤7和步骤8赋值结束后,内存中的情况:

经过前面一步步分析,程序执行时内存的情况就很清晰了

步骤 9,10,11,12 和前面输出的步骤一样 ,这里就不再赘述。

      main方法结束后,因为main方法执行在栈中占用的空间将全部被释放。堆空间,将等垃圾回收执行后被释放。关于垃圾回收的内容,后面的文章将会分析。

        以上就是内存解析的全部过程了,希望能对你有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/627498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5年测试面试要20K,面试三个问题把我打发走了···

都说金三银四,金九银十跳槽涨薪季,我是着急忙慌的准备简历——5年软件测试经验,可独立测试大型产品项目,熟悉项目测试流程…薪资要求?5年测试经验起码能要个20K吧。 我加班肝了一页半简历,投出去一周&…

22种不同的社交媒体内容类型(2023年指南)

您是否觉得自己的社交媒体帖子陷入了无休止的循环?您是否已经无话可说并且感到厌烦了?看起来你没有得到任何牵引力吗? 别担心 — 这些感觉在营销人员和小企业主中很常见。今天,我们将探索社交媒体内容的世界,并为您提…

React-Router 5.0 制作导航栏+页面参数传递

React使用路由 使用React构建SPA应用(单页面应用),要想实现页面间的跳转,首先想到的就是使用路由。在React中,常用的有两个包可以实现这个需求,那就是react-router和react-router-dom。本文主要针对react-router-dom进行说明。 …

麒麟V10服务器 安装samba 软件,并且实现远程连接(压缩包形式)

目录 1 安装包2 实现3 如何查看安装的sambd 的版本4 使用 1 安装包 百度网盘 链接: https://pan.baidu.com/s/1l6HDAGE4_Itj-cp7XtpUNg 提取码: 100w 复制这段内容后打开百度网盘手机App,操作更方便哦2 实现 以下是在Linux系统中使用压缩包方式安装Samba服务的步…

angular框架-通过依赖注入方式挂载loading以实现任意地方一行代码调用全局loading

前言 本文主要阐述关于在angular项目中,loading的常见的使用方式,以及如何全局挂载loading,实现一行代码控制loading开,一行代码控制loading关闭。 正文 首先在angular中增加loading,主要就是组件级和全局挂载&…

Python+appium自动化测试-调用服务器接口

当前很多APP登录都需要绑定手机号,但当我们需要足够多的模拟新用户的注册登录时,无法提供大量的手机号来测试,所以可以让服务器给出一个清除账号的接口,在写自动化脚本的时候可以调用这个接口,保证能够使用一个账号进行…

pycharm的基本使用

废话文学 本人记录笔记始终遵循“能动手绝不动脑,能动脑绝不动手”的基本原则。不会的操作,跟着笔记干就完事了,还动啥脑袋?留着脑细胞刷抖音擦边小姐姐他不香吗? 什么是IDE IDE即【集成开发环境】,Inte…

【Algorithm】Java刷题中要熟练使用的容器Api、Stream流、Lambda表达式

Java刷题中要熟练使用的Stream流、Lambda表达式、容器Api 1.Stream流1.概述2.分类3.具体用法流的常用创建方法 2.Lambda表达式函数式接口Lambda书写语法方法引用 3.各类Api 1.Stream流 1.概述 Stream Api是「集合操作」的一种简化表达形式。其特点是惰性求值,流在…

maven repositories更新失败

在项目的pom文件中添加以下配置 <repositories><repository><id>alimaven</id><name>Maven Aliyun Mirror</name><url>http://maven.aliyun.com/nexus/content/repositories/central/</url><releases><enabled>tr…

视频批量剪辑软件开发源码+SaaS

工具能力 API 描述 上传素材接口 开发者可通过本接口将使用素材上传至抖音服务器。 上传临时素材接口 上传临时素材接口。 获取素材列表接口 获取素材列表接口。 删除素材接口 删除素材接口。 小程序接口能力 获取小程序接口能力。 模拟webhook事件 模拟webhook事…

基于Python的接口自动化-HTTP接口基本组成和网页构成

目录 引言 1、HTTP简介 2、HTTP原理和网页基础 2.1、 HTTP基本原理 2.2、 HTTP请求过程 2.3、 网页构成 【自动化测试工程师学习路线】 引言 在我们进行接口测试时&#xff0c;了解HTTP接口的基本组成和网页构成是非常重要的。 而Python作为一门功能强大、易学易用的编程…

亚马逊美国站 解压神器减压小玩具CPC认证

解压玩具又称减压玩具Relaxing toys&#xff0c;包括挤压、摔砸、揉捏、旋转等多种类型&#xff0c;主要供成年人使用&#xff0c;帮助释放压力。 当提到解压玩具时&#xff0c;通常指的是一类旨在缓解压力、放松心情的小型玩具。以下是几种常见的解压玩具及其简要介绍&#x…

一键开启GPT 平行时空模式

不知道大家日常使用GPT的时候&#xff0c;在一次会话中是如何完成同类任务的对话的? 简单点来说&#xff0c;假设你已经完成了角色设定&#xff0c;比如你设定GPT是一名文案编辑&#xff0c;那么接下来你会多次给它提交稿件让它进行编辑&#xff0c;那么在多次提交的时候&…

基于jsp+mysql+Spring+mybatis+VUE的SpringBoot电影院会员积分管理系统

运行环境: 最好是java jdk 1.8&#xff0c;我在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以&#xff0c;如果编译器的版本太低&#xff0c;需要升级下编译器&#xff0c;不要弄太低的版本 tomcat服务器环…

【剑指offer专项突破版】数组篇——“C“

文章目录 前言一 . 排序数组中两个数字的和题目分析思路分析法①代码——双指针法②代码——二分查找 二. 数组中和为 0 的三个数题目分析问题转换代码 三. 和大于等于 target 的最短子数组题目分析思路分析代码 四. 乘积小于 K 的子数组题目分析思路分析代码 五. 和为 k 的子数…

2023 年前端 Web 发展趋势

虽然就个人观点&#xff0c;我觉得 Web 开发在最近几年都没什么进展&#xff08;2016 年至 2021 年&#xff09;&#xff0c;但在刚刚过去的 2022 年中确实又出现了一些新的技术。在本文中&#xff0c;我想跟大家聊聊自己看到的最新 Web 开发的发展趋势。相信这波浪潮会继续激发…

PLC采集串口被占用、网口被占用,网络IP地址不能修改、多台设备IP不同网段等问题解决方案

在我们数据采集项目中&#xff0c;经常碰到端口被串口被触摸屏占用&#xff0c;网口被占用&#xff0c;修改IP增加风险&#xff0c;另外增加新的端口需要通过PLC的编程软件组态&#xff0c;涉及到上传下载PLC程序&#xff0c;耗时耗力很不方便。以下是我们总结的项目中解决办法…

JVM-对象布局

JVM中对象布局 通过引入JOL工具&#xff0c;查看对象在JVM中的布局。 <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.14</version></dependency>对象的在JVM中的基本信息 普通…

iconfont字体的引用

官网&#xff1a;giconfont-阿里巴巴矢量图标库iconfont-国内功能很强大且图标内容很丰富的矢量图标库&#xff0c;提供矢量图标下载、在线存储、格式转换等功能。阿里巴巴体验团队倾力打造&#xff0c;设计和前端开发的便捷工具https://www.iconfont.cn/1. 搜索图标&#xff0…

【正点原子STM32连载】 第三十章 ADC实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第三十…