怎么找到项目中所有同名的类_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)人为分析各个变量特征与目标值之间的关系&…

poj 2886 Who Gets the Most Candies?(线段树)

题目链接:poj 2886 Who Gets the Most Candies?题目大意:N个人围成一圈玩约瑟夫环游戏,不同的是。步长不固定,由前一个出局的人决定。给定K表示起始的人。第i个淘汰的人将获得g(i)个糖果,问说谁获得的糖果最多。g(x)为…

linux c之动态打开链接库(dlopen dlsym dlclose)

1 linux提供了加载和处理动态链接库的系统调用 2 主要函数 1) dlopen、 dlopen以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程,打开模式如下: RTLD_LAZY 暂缓决定,等有需要时再解出符号 RTLD_NOW 立即决定,返回前解除所有未决定的符号。 2) dlsym、 …

甘肃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…

基于GLT法的风云三号气象卫星校正

GLT几何校正法利用输入的几何文件生成一个地理位置查找表文件(geographic lookup table,GLT),从该文件中可以了解到某个初始像元在最终输出结果中实际的地理位置。地理位置查找表文件是一个二维图像文件,文件中所包含两个波段:地理校正图像的行和列,文件对应的灰度值表示…

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

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

CentOS下MySQL忘记root密码解决方法【转载】

1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录和修改MySQL的信息。可以采用将MySQL对 外…

MYSQL - php 使用 localhost 无法连接数据库

php 使用 localhost 无法连接数据库,而使用127.0.0.1却能连接成功。 可能原因: 系统hosts文件未提供127.0.0.1到localhost的解析。解决方法(以win7系统为例):找到C:\Windows\System32&#xff3…

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

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

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

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

C语言之在结构体里面放很多函数指针

1 原因 看了open ssl代码里面很多在结构体里面放很多函数指针,然后再来调用,这样比较规范和统一 2 代码实现 #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <string.h> #include <pthread.h>typedef struct key_info …

计算机模拟考总结,高职单考单招计算机模拟一技术总结.doc

高职单考单招计算机模拟试卷一一、选择题(30*4分120分)1&#xff0e;从1946年第一台计算机诞生算起&#xff0c;计算机的发展至今经历了(? )4个年代。A.低档计算机、中档计算机、高档计算机、手提计算机B.微型计算机、小型计算机、中型计算机、大型计算机C.电子管计算机、晶体…

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

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

ENVI支持下利用高分辨率影像城市绿地信息提取方案

城市绿地在改善城市生态环境和人居环境起着积极的作用,城市绿地含量逐渐成为衡量城市生活质量的一个重要指标。此外,城市绿地的空间分布格局与其生态效应有着密切的关系。因此,必须客观、准确地掌握城市绿地信息。传统的城市绿化调查主要通过基层单位上报统计数据和实地抽样…

Job make U funck Uself!!!

今天武汉大雨&#xff0c;对于这个鬼地方已经习以为常&#xff0c;在实验室又一次看到有人前来应聘。 突然意识到当今学无大用&#xff01;&#xff08;一个英语专业毕业的本科生应聘秘书&#xff08;打杂的跑腿的&#xff09;&#xff09; 更让我惊讶的是这位竟然说不拿工资先…

nmap脚本使用总结

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

python爬虫实例手机_Python爬虫实现爬取京东手机页面的图片(实例代码)

实例如下所示&#xff1a; __author__ Fred Zhao import requests from bs4 import BeautifulSoup import os from urllib.request import urlretrieve class Picture(): def __init__(self): self.headers {User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) Ap…