14、类与对象(采用图解方式分析内存结构)①

news2024/11/27 21:34:31

在idea中创建一个新文件,名称为Hello.java
在这里插入图片描述
其中,Hello就是一个类,main是这个类里面的方法,这意味着我们在学习的时候已经在使用类了。

对象和类

  • 一、概念
  • 二、⭐内存分配机制分析
    • Ⅰ、基本内存结构
    • ⭐⭐Ⅱ、调用类方法的内存分析(栈思想)

一、概念

简单性解释:类是一个模板,对象是根据这个模板创建的(专业语法:类的实例)。
看图就懂了:
在这里插入图片描述

上代码:

//建立一个类
class Dog{
    //类的属性:可以为基本数据类型,也可以为引用类型(数组、对象)
    String breed;       //品种
    String size;        //大小
    String name;        //名字

    //类的方法:方法修饰符有public、private等,后期在写笔记
    void eat(){
        System.out.println("吃东西");
    }
    void run(){
        System.out.println("跑步");
    }
    void sleep(){
        System.out.println("睡觉");
    }
}

public class Hello{
    public static void main(String args[]) {
        //用类去创建一个对象
        Dog Dog1 = new Dog();
        //赋值属性
        Dog1.breed = "博美";		
        Dog1.size = "小型犬";
        Dog1.name = "来福";

        //调用方法
        Dog1.eat();
        Dog1.run();
        Dog1.sleep();
        
    }
}

结果:
在这里插入图片描述
拿人这个群体来举例的话,人类就是一个抽象集合(属性包括姓名、性别、年龄,方法包括吃饭、睡觉),我们每个人都是根据人类这一个模板来创建的,都有姓名、性别、年龄,都会吃饭、睡觉,因此是具体的。(很简单的理解就可以了,没必要记繁杂的专业解释!!!)

注意细节:
1、访问里面的属性、方法是用 对象名.属性(方法)进行访问。
2、属性如果不赋值,有默认值。(和数组一样)

数据类型默认值
byte0
short0
int0
long0
float0.0
double0.0
char\u0000
booleanfalse
Stringnull

二、⭐内存分配机制分析

Java内存结构(简单版)
1、栈:一般存放基本数据类型(局部变量)
2、堆:存放对象(数组、Dog1对象)
3、方法区:常量池(常量,比如字符串),类加载信息

对下面的代码进行内存分析:(步骤看代码,一定要看啊,朋友们,和数组其实很像)

Ⅰ、基本内存结构

//用类去创建一个对象(采用先声明,在创建的方式,方便演示步骤而已)
//1、先加载Dog类信息到方法区,包括属性和方法,只会加载一次
Dog Dog1;		
//2、new Dog():类为引用类型,在堆中分配空间,进行默认初始化
//3、把步骤2创建的对象地址赋给Dog1,此后Dog1指向这个对象
Dog1 = new Dog();

//4、进行指定的初始化
Dog1.breed = "博美";
Dog1.size = "小型犬";
Dog1.name = "来福";

Dog Dog2 = new Dog();	//这里不在加载Dog信息,因为只加载一次就可以了

在这里插入图片描述
如果看过13、数组(一维、二维用图形化的方式解析内存空间⭐)这篇文章就会发现,在堆区中发生了变化,为什么里面的breed、size、name存放的是一个地址呢?因为这几个变量是String类型(引用类型),所以里面存储的是相关值的地址,然后通过这个地址在指向“博美”、“小型犬”、“来福”这几个值。

这里提示,String类型有点特殊,它的值是存放在变量池的,当我们赋值Dog1.breed = “博美”,JVM首先会在常量池中找有没有“博美”这个字符串,若有则直接指向该地址,若无会在常量池创建一个新的字符串,然后指向该字符串的地址,推荐去看这个链接:java字符串内存 java中字符串存在哪里

⭐⭐Ⅱ、调用类方法的内存分析(栈思想)

需要用到栈的一点知识:栈是先进后出的,意味着,最后进来的反而最早出去。
这里只演示方法的调用,还没有涉及方法里面的值传递和引用传递,下一篇在写这个,这里只简单展示栈的变化。
每次调用方法都会在栈区开辟一块新的区域给这个方法,内存图中的栈名都是按演示方便取得,不要在意哈哈哈。
①首先展示的是只在main()方法里面调用Dog类方法的情况:
在这里插入图片描述

 
②这里展示的是先在main()方法中访问Dog类的方法,然后Dog类中的方法在访问Dog类自身方法的情况:
在这里插入图片描述
在这里插入图片描述
其实很简单的,只要你学过栈,就能简单理解成每次调用一个方法都要进栈,执行完该栈中的代码之后就要出栈,就ok了。

下一篇文章写类方法中的值传递和引用传递,这篇文章的进出栈图都是简单举例,还没有任何修改类属性的步骤。
本人正在B站跟着韩顺平老师学Java(非广告),所以做个笔记仅供学习,文章虽标为原创,但大体思路是韩顺平老师的授课思路,在此基础上加上了自己的理解,不喜勿喷哦。
大家一起学,一起进步!!
各位宝子们如果觉滴还不错的话,可以点个赞 or 收个藏 or 打个赏哦,佛系博主一个。

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

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

相关文章

HCIP的学习(24)

第七章,VLAN—虚拟局域网 ​ 通过在交换机上部署VLAN技术,将一个规模较大的广播域在逻辑上划分成若干个不同的、规模较小的广播域。 ​ IEEE 802.1Q标准----虚拟桥接局域网标准----Dot1Q标准 标签协议标识符:0x8011(代表数据帧是8…

MySQL数据库案例实战教程:数据类型、语法与高级查询详解

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

【Python-OS】os.path.splitext()

作用:将文件路径分割成文件名和扩展名两部分。 slide_id, _ os.path.splitext(slide) print("slide:") print(slide) print("slide_id:") print(slide_id)注: slide是文件名,可以自行赋值

美光EMMC芯片丝印型号查询 8LK17/D9PSK, OXA17/JY997

问题说明 最近在使用美光EMMC的时候,发现通过芯片丝印查询不到 芯片的规格说明书; 经过查阅资料,发现美光的EMMC芯片 “由于空间限制,FBGA 封装组件具有与部件号不同的缩写部件标记”,需要通过官网查询丝印的FBGA cod…

极验3逆向 JS逆向最新点选验证码 逆向分析详解

目录 声明! 一、请求流程分析 二、w参数生成位置 三、主要问题 四、结果展示 原创文章,请勿转载! 本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。 声明! 本文章中所有内容仅供学习交流…

《中国科技投资》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答: 问:《中国科技投资》期刊什么级别? 答:国家级 问:《中国科技投资》期刊是核心期刊吗? 答:不是,是万方维普收录的正规期刊。 主管单位:中国信息协会 主办单位&#…

SwiftUI中EnvironmentObject的使用(多界面共享数据)

SwiftUI的EnvironmentObject是一个强大的工具,它允许你在多个视图之间共享数据(使用一个可观察对象)。当你有一个复杂的视图层次结构,并且需要在没有直接连接的视图之间共享相同的可观察对象时,它特别有用。 我们之前传递数据主要是通过init…

详解 Scala 的变量、标识符、数据类型

一、注释 Scala 注释与 Java 一致 // 单行注释/** 多行注释*//*** 文档注释*/二、变量与常量 1. 语法 // 变量,类型可以省略 var varName:varClass value // 常量,类型可以省略 val valName:valClass value2. 案例 // 使用 var/val 才会在类中声明属…

【教学类-58-06】黑白三角拼图06(1页3张彩色黑点卡片,一种宫格36张,适合一个班级一次操作)

作品展示 背景需求 【教学类-58-05】黑白三角拼图05(2-10宫格,每个宫格随机1张-6张,带空格纸,1页3张黑白3张白卡)-CSDN博客文章浏览阅读343次,点赞10次,收藏6次。【教学类-58-05】黑白三角拼图…

线性插值的频域特性

1、抽取和插值的简单说明 抽取和插值是变采样过程中常用的两种手段,其中抽取的目的是降低数据的采样率,以降低对系统存储深度或计算量的要求。插值的目的是提高数据的采样率,以提高系统的计算精度。 M M M倍抽取通常是通过每隔 M M M…

卧槽!这项目开源了!【送源码 】

随着科技的飞速发展,个人财务管理变得越来越重要。一个名为‘Maybe’的创新型个人财务与财富管理应用程序随之诞生,它以其丰富的功能和用户友好的界面受到了广大用户的关注。 现在项目方将这个价值 100万美元的个人理财应用项目开源了 Maybe Maybe应用…

利用cherry pick巧妙地将某次提交单独合并到其他分支

0. 引言 最近在进行系统的多版本并行开发,涉及一些共有基础功能提交时就遇到了麻烦,一份代码需要向多个版本分支进行同步,以保证多版本都能有更新该基础功能。 多次对比提交的方式显然会带来巨大的工作量。但实际上我们可以通过git的cherry…

5,串口编程---实现简单的用串口发送接收数据

单片机通过串口向PC机发送数据 PC机通过串口接收单片机发过来的数据 1.UART和USART的区别: USART支持同步通信方式,可以通过外部时钟信号进行同步传输,而UART仅支持异步通信方式 本开发板STM32F103ZET6有5个串口,用串口1作调试串口,因为串…

git教程(IDEA + 命令行)

首先假设你已经安装 git 且 已经初始化完成: // 初始化git config --global user.name "你的用户名" git config --global user.email "你的邮箱"在当前文件夹下创建一个仓库,且该文件夹下会有多个项目 首先在当前文件夹下新建git…

网工内推 | 高校、外企网工,IE认证优先,年薪最高18w

01 上海外国语大学贤达经济人文学院 🔷招聘岗位:高校网络主管 🔷职责描述: 1、负责总机房、网络规划及管理,包括容量规划、成本评估、建设管理等; 2、负责设计、实施及维护全网络架构及规划网络变更计划 3、负责网络功…

什么是“SQL注入攻击”?如何预防和应对?

一、SQL注入攻击的概念 SQL注入攻击是一种针对数据库驱动的应用程序的攻击技术,其中攻击者通过在应用程序的输入字段中插入或“注入”恶意的SQL代码,试图非法访问、操作或破坏后端数据库。当应用程序不正确地处理用户输入,并将其直接拼接到SQ…

C++学习/复习7--泛型编程/函数模板/类模板

一、泛型编程 1.Swap()函数的模板实现 二、函数模板 1.概念 2.格式 3.实例化 (1)隐式与显示 注意事项:隐式与显示类型转换会产生临时变量,临时变量有常性,所以形参前加const 三、类模板 1.定义 2.例1 3.例2 4.注意事…

错误模块路径: ...\v4.0.30319\clr.dll,v4.0.30319 .NET 运行时中出现内部错误,进程终止,退出代码为 80131506。

全网唯一解决此BUG的文章!!! 你是否碰到了以下几种问题?先说原因解决思路具体操作1、首先将你C:\Windows\Microsoft.NET\文件夹的所有者修改为你当前用户,我的是administrator。2、修改当前用户权限。3、重启电脑4、删…

力扣225. 用队列实现栈

Problem: 225. 用队列实现栈 文章目录 题目描述:思路Code 题目描述: 思路 1.对一个queue模拟栈的操作,同时用一个int类型的变量topElem记录每次每次队列队尾的元素(也即是模拟stack中的stack的栈顶元素); 2…

Java Web集成开发环境Eclipse的安装及web项目创建

第一步:下载安装JDK http://t.csdnimg.cn/RzTBXhttp://t.csdnimg.cn/RzTBX 第二步:下载安装Tomcat Tomcat下载安装以及配置_tomcat下载配置-CSDN博客文章浏览阅读2.5k次,点赞2次,收藏13次。Tomcat下载安装及其配置_tomcat下载配…