怎么找到项目中所有同名的类_26岁转行程序员的成长历程--Day03从内存层面理解类和对象...

今天学习了类、对象及相关知识,试着从内存角度分析三者关系,如果有不对的地方请指正

首先得先介绍java中的三个内存区域:

  • 栈区

用于存放该线程执行方法的信息(实际参数、局部变量等)。栈属于线程私有,不能实现线程间的共享。栈的存储特性是“先进后出,后进先出”。栈是由系统自动分配,速度快!栈是一个连续的内存空间

  • 堆区

堆用于存储创建好的对象和数组(数组也是对象)。JVM只有一个堆,被所有线程共享。 堆是一个不连续的内存空间,分配灵活,速度慢

  • 方法区

方法区用来存放程序中永远不变或唯一的内容,如类、静态变量、字符创常量等。JVM只有一个方法区,被所有线程共享。方法区实际是堆中的一个区域,只是用于存储类、常量相关的信息

5cd91a28a078397a4b38d5165eb3e333.png
JVM内存模型
package cn.sxt.oo;public class zhihu {public static void main(String[]args) {B b = new B();b.printA();b.printB();}}class B{int a = 0;static int b=0;public void printA() {System.out.println(a);}public static void printB() {System.out.println(b);}
}

下面来看这一段代码

1. 类的加载

首先第一步,加载zhihu这一个类,在方法区中存入类信息和类当中的静态变量、静态方法和常量。

总结:类的加载是在类第一次被使用的时候,从代码上看,简单来说就是类名第一次出现的地方。可以是类的第一个对象创建的时候,也可以是通过 “类名.静态变量” 调用类中静态变量的时候。

2.对象创建

完成了class zhihu的加载之后,将会执行main方法,系统会在栈空间中开一个栈帧存放main方法。然后下一句代码是对象b 的构造方法。但是此时并不马上执行构造方法。因为class B尚未初始化,因此在生成对象之前会完成class B的初始化。

5df432c3864d328fef1459127a35f06f.png
执行构造方法钱,进行class B的初始化

初始化class B后,在堆空间中分配内存用于存放对象 b的信息,执行b中属性的显式初始化,并给属性赋数据类型默认的初始值,如:int a 就赋值0;

dfa78184e8e1c05e76b02a5b8019a8e0.png
执行对象的显式初始化,并给变量赋默认的初始值

完成对象空间的分配,属性的显式初始化和初始化赋值之后,才会执行构造方法,此时在栈区中中载入b的构造方法:B b = new B(); 当执行到B b 的时候,main的栈帧中会生成b的局部变量,当执行到new 的时候,将堆中新建的b对象地址赋给栈中的b。

64a7c33814261dac21a758742fb686d4.png
对象初始化

之后构造方法会将方法区中的常量赋值给堆中的变量,之后构造方法执行结束,从栈帧中释放

总结:对象的创建过程为类的初始化、对象空间分配、属性初始化、执行构造方法并将类中的常量赋值给对象。

非静态方法的执行

在执行到 b.printA();时,开新栈帧。printA方法会找到main方法中的对象b,根据对象地址找到堆中的printA()方法。然后找到变量a并输出,执行完成以后该方法的栈帧会被释放

31dc0658f3e89f1a8ba734143462873e.png

静态方法的执行

执行到b.printB();时,也是一样先开新栈帧。从方法区加载方法p.printB(),然后找到方法区中的静态变量b,并输出。

b60b872dc1af80f07ddad39029c366a4.png

总结:方法的调用本质上就是地址的传递,如B b = new B(); 本质上是将新创建的b的地址传递给 b;再比如b.printA();即通过b的地址找到printA的方法。当然也可以通过类名去找,如B.printA();

思考:静态方法中能否调用非静态方法或非静态变量

答案显然是不能的,因为类加载的时候不一定有对象,而非静态方法和变量只有对象建立之后才有。因此在静态方法中肯定是没有非静态方法或对象的地址的。那么如何实现静态方法调用非静态变量呢,只需要提供一个地址即可,我们可以在静态方法中建立一个对象,通过建立的对象去找到非静态方法。如以下代码

public void testPrintA(){B b2 = new B():b2.printA();
}

f0d121e860de496f394efd77d4c7042b.png

思考:类与类之间能否互相调用

非静态方法肯定是要实例化以后通过 对象名.方法名/变量名 去调用

而静态方法是可以互相调用的,用类名.方法名/变量名 或者 对象名.方法名/变量名调用

class A{ B b;public void printB1(){   B.printB();  } public void printB2(b){b.printB();}
}

48222b6d4f5c4fcb3fa30e2b03871353.png

思考:this关键字的本质——指向当前对象

this关键字的用法:

  • 构造器中用于区分同名的局部变量和成员变量

局部变量是方法执行时存放在栈中的,与成员变量生重名时,this就可以指向堆中的成员变量,这样就区分开了。

  • 构造器中调用另一个构造器

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

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

相关文章

pycharm提示your evalluation license has expired解决方法

安装pycharm,一段时间后提示your evalluation license has expired:打开pycharm--点击help--register--选中license server,输入license server address如图示即可 转载于:https://www.cnblogs.com/youtiaoge/p/7125070.html

【SPSS统计分析】SPSS聚类分析:一个案例演示聚类分析全过程(附SPSS 19.0中文版下载)

摘要:案例数据源: 有20种12盎司啤酒成分和价格的数据,变量包括啤酒名称、热量、钠含量、酒精含量、价格。数据来自《SPSS for Windows 统计分析》。 目 录 问题一:选择那些变量进行聚类?——采用“R型聚类

python利用特征进行可视化样本显示_利用Python进行机器学习之特征选择

毫无疑问,解决一个问题最重要的是恰当选取特征、甚至创造特征的能力,这叫做特征选取和特征工程。对于特征选取工作,我个人认为分为两个方面:1)利用python中已有的算法进行特征选取。2)人为分析各个变量特征与目标值之间的关系&…

甘肃2019年9月计算机二级报名入口,2019年9月甘肃计算机二级考试成绩查询入口...

【摘要】2019年9月份计算机二级考试已经圆满结束,参加考试的小伙伴们已经迫不及待的想要知道成绩了吧,小编对2019年9月甘肃计算机二级考试成绩查询入口进行了整理,参加9月份考试的朋友们到时候记得按时查询成绩哦!想要了解更多计算…

FluentEmail - 适用于 .NET 和 .NET Core 的邮件发送库

简介FluentEmail - 适用于 .NET 和 .NET Core 的邮件发送库从 .NET 和 .NET Core 发送电子邮件的最简单方法。将 Razor 用于电子邮件模板并使用 SendGrid、MailGun、SMTP 等进行发送Nuget包•FluentEmail.Core - 域模型•FluentEmail.Smtp - 通过 SMTP 服务器发送电子邮件•Flu…

安装MySql出现Error Nr.1045的解决办法

如图,最后一步出现这个错误框 这是因为上次安装过MySql,其用户数据在卸载的时候没有被删除掉,解决办法如下: 显示隐藏的文件夹,打开C盘,找到下图文件删除之 删除之后再安装一遍MySQL,就可以了转…

python网易云_用python爬虫爬取网易云音乐

标签: 使用python爬虫爬取网易云音乐 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页版找一下你想要听的歌曲点击进去。按键盘F12打开网页调试工具,点击Network就可以查看网络请求的相关信息,选择XHR,然后可以看…

android 固定底部 布局_Android系统列表控件

在android系统控件中,有多个控件可以展示列表数据。一、ListView该组件是android中最常用的一个UI组件,用于实现在屏幕上显示多个内容,以便于我们用手指进行滑动。ListView控件以列表的形式展示具体内容,并且能够根据数据的长度自…

.NetCore中IdentityServer使用nginx-proxy的一次排错经历

前言最近在看 Duende.IdentityServer.Admin,本地使用IIS Express跑了一下源码,也看了一遍的代码,决定使用他们的模板创建一个Demo,部署在本地的Docker环境中,也算是踩一下坑吧。以下不会详细介绍项目的部署&#xff0c…

nmap脚本使用总结

原文链接:http://drops.wooyun.org/tips/2188 0x00 前言: nmap的基本介绍和基本使用方法,在乌云知识库中已经有人提交过,讲的比较详细,在此文中就不再讲述。 具体链接:http://drops.wooyun.org/tips/2002 本…

身份管理软件公司Okta计划IPO,目标融资1亿美元

Okta是一家专门提供身份管理和单点登陆(SSO)软件的公司。今日公司提交了一份S-1表格正式启动了IPO程序。根据文件内容显示,Okta计划在首次公开募股中融资1亿美元。 公司表示,Okta将在纳斯达克上市,股票代码为OKTA。 即…

jmeter对乱码如何处理_JMeter读取 Excel 表中用例数据实现接口压测

传统的接口测试,都是在接口中手动输入不同用例准备的多种场景参数数据,一遍一遍的输入来执行多个不同的用例,但是现在利用excel表格准备各种类型的数据,使用Jmeter中Jmeter CSV Data Set Config参数化实现可设置的、一次性的读取e…

C# 利用.NET 升级助手将.NET Framework项目升级为.NET 6

概述.NET6 正式版本已经发布有一阵子了,今天我就体验一下如何将.NET Framework的项目升级为.NET 6.升级条件:Windows 操作系统.NET 6 SDKVisual Studio 2022 17.0 或更高版本环境准备①首先是VS2022下载,直接上微软官方网站,下载地…

城市遥感动态监测管理系统

1.系统概述 随着全国各城市数字化进程的发展,高分辨率遥感影像和数字航空影像为“数字城市”的建设提供了丰富的数据源。近年来,遥感影像的空间分辨率和光谱分辨率的明显提高,使得高分辨率遥感影像和数字航空影像的应用得到了极大的延伸。在城…

3月第4周全球域名商TOP15:万网第四 涨幅居亚

IDC评述网(idcps.com)04月03日报道:据WebHosting.info公布的最新数据显示,在3月第4周,全球域名商域名总量十五强排行榜中,美国占10个席位,成为最大赢家。其次是中国,有3家域名商上榜…

【Blog.Core开源】框架集成部门权限

(Blog.Core框架功能点概述)Blog.Core开源四年啦,一行行代码凝结了大家的热情和心血,基本功能骨架已完成,欢迎更多的公司和企业使用哟。真实公司留言盖楼可获得一对一技术指导:https://github.com/anjoy8/Bl…

[一个经典的多线程同步问题]解决方案一:关键段CS

前面提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题。 本文先介绍如何使用关键段,然后再深层次的分析下关键段的实现机制和原理。 关键段CRITICAL_SECTION一共就四个函数,下面说一下这四个函数的原型…

服务器线程数一直增加,.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长...

一个 asp.net core 站点,之前运行在Linux 服务器上,运行一段时间后有时站点会挂掉,在日志中记录很多“EMFILE too many open files”的错误:Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -24 EMF…

python种颜色循环_Python 实现一个颜色色值转换的小工具

需求说明 公司的 UI 设计小哥,已经转用 Zeplin 很久了。Zeplin 的设计稿展示页面的颜色色值使用十进制的 RGB 表示的,在 Android 中的颜色表示大多情况下都需要十六进制的 RGB 表示。我的数学没有好到直接看到十进制就可以心算得到十六进制的结果&#x…

bugly中批量隐藏版本

App项目使用Bugly的内测分发功能进行整包的测试,但日积月累之后,版本就会特别多。而线上同时跑的版本可能不过三个左右,那么多版本会干扰到查看崩溃、选择版本,如何隐藏呢? 右上角,更多 –> 产品设置 –…