怎么找到项目中所有同名的类_26岁转行程序员的成长历程--Day03从内存层面理解类和对象...
今天学习了类、对象及相关知识,试着从内存角度分析三者关系,如果有不对的地方请指正
首先得先介绍java中的三个内存区域:
- 栈区
用于存放该线程执行方法的信息(实际参数、局部变量等)。栈属于线程私有,不能实现线程间的共享。栈的存储特性是“先进后出,后进先出”。栈是由系统自动分配,速度快!栈是一个连续的内存空间
- 堆区
堆用于存储创建好的对象和数组(数组也是对象)。JVM只有一个堆,被所有线程共享。 堆是一个不连续的内存空间,分配灵活,速度慢
- 方法区
方法区用来存放程序中永远不变或唯一的内容,如类、静态变量、字符创常量等。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的初始化。
初始化class B后,在堆空间中分配内存用于存放对象 b的信息,执行b中属性的显式初始化,并给属性赋数据类型默认的初始值,如:int a 就赋值0;
完成对象空间的分配,属性的显式初始化和初始化赋值之后,才会执行构造方法,此时在栈区中中载入b的构造方法:B b = new B(); 当执行到B b 的时候,main的栈帧中会生成b的局部变量,当执行到new 的时候,将堆中新建的b对象地址赋给栈中的b。
之后构造方法会将方法区中的常量赋值给堆中的变量,之后构造方法执行结束,从栈帧中释放
总结:对象的创建过程为类的初始化、对象空间分配、属性初始化、执行构造方法并将类中的常量赋值给对象。
非静态方法的执行
在执行到 b.printA();时,开新栈帧。printA方法会找到main方法中的对象b,根据对象地址找到堆中的printA()方法。然后找到变量a并输出,执行完成以后该方法的栈帧会被释放
静态方法的执行
执行到b.printB();时,也是一样先开新栈帧。从方法区加载方法p.printB(),然后找到方法区中的静态变量b,并输出。
总结:方法的调用本质上就是地址的传递,如B b = new B(); 本质上是将新创建的b的地址传递给 b;再比如b.printA();即通过b的地址找到printA的方法。当然也可以通过类名去找,如B.printA();
思考:静态方法中能否调用非静态方法或非静态变量
答案显然是不能的,因为类加载的时候不一定有对象,而非静态方法和变量只有对象建立之后才有。因此在静态方法中肯定是没有非静态方法或对象的地址的。那么如何实现静态方法调用非静态变量呢,只需要提供一个地址即可,我们可以在静态方法中建立一个对象,通过建立的对象去找到非静态方法。如以下代码
public void testPrintA(){B b2 = new B():b2.printA();
}
思考:类与类之间能否互相调用
非静态方法肯定是要实例化以后通过 对象名.方法名/变量名 去调用
而静态方法是可以互相调用的,用类名.方法名/变量名 或者 对象名.方法名/变量名调用
class A{ B b;public void printB1(){ B.printB(); } public void printB2(b){b.printB();}
}
思考:this关键字的本质——指向当前对象
this关键字的用法:
- 构造器中用于区分同名的局部变量和成员变量
局部变量是方法执行时存放在栈中的,与成员变量生重名时,this就可以指向堆中的成员变量,这样就区分开了。
- 构造器中调用另一个构造器
怎么找到项目中所有同名的类_26岁转行程序员的成长历程--Day03从内存层面理解类和对象...相关推荐
- c# 如何找到项目中图片的相对路径
c# 如何找到项目中图片的相对路径 string path = System.Environment.CurrentDirectory;//非Web程序 if (System.Environment. ...
- 写给还在迷茫中的朋友,一名6年程序员的工作感悟!!!
前言 很多年前,刚刚从大学毕业的时候,很多公司来校招.其中最烂俗的一个面试问题是:"你希望你之后三到五年的发展是什么?".我当时的标准回答是(原话):"成为在某一方面能够 ...
- 百万英雄类答题游戏的程序员打开方式
最近知识答题类的app应用和网站 都很火 所以机器人多了,,百度度秘.搜狗小汪等 Python发挥了很大作用 <百万英雄><冲顶大会><头脑王者><一站到 ...
- 我35岁,程序员,“中危”后帮别人规划人生
35 岁,有妻有子,有房有车,但却没有上升空间了. 做程序员,35 岁是个"终极门槛",如果不能往上做管理,可能就要重新考虑是否需要转行--如果不主动考虑,也很可能被公司主动&qu ...
- 40岁的程序员还能找到工作吗_如果程序员已经到三十岁了,那他还能找到满意的工作吗?...
作为已经快奔四的老程序员,看到话题就想吐槽两句,三十岁的程序员正好是黄金时期,无论从编程经验还是身体状态,都处于一个极佳的状态,虽然程序员喜欢通过互联网的方式吐糟自己,特别是大家都在吐槽程序员都是吃青 ...
- 39岁java程序员,待业中,对前途很迷茫,每天都很焦虑,不知道该怎么办?
39岁java程序员,待业中,对前途很迷茫,每天都很焦虑,不知道该怎么办?第一次看到这个问题,觉得挺无奈的.39岁这个年纪,工作应该也有10多年,对于程序员岗位,如果平时没有放弃学习,相信专业技术能力 ...
- 挑战程序员同学,如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数?
按位比较,比如先遍历一遍数字,判断第一位是0还是1多,然后便利多的那一位的数字,判断第二位是0还是1多,依次判断到第32位,就是出现次数最多的数字了 好吧,这个算法不对 我感觉这个题目是不是考的排序算 ...
- java 静态方法_80后程序员,教你学Java核心技术:用户自定义类+静态域静态方法
用户自定义类 在第3章中,已经开始编写了一些简单的类.但是,那些类都只有一个简单的main方法.现在让我们开始学习如何设计复杂应用程序所需要的各种"主力类"(workhorse c ...
- 项目经验不丰富、技术不突出的程序员怎么打动面试官?
前言 相信不少的程序员都有过类似的困惑:如果我没有大型的项目经历,也不能靠技术征服面试官,那我要怎么才能给面试官留下一个好印象呢? 按照本人的面试经验来说,面试主要看几点:项目经验+基本技术+个人潜力 ...
最新文章
- 数据类型,运算符和表达式03 - 零基础入门学习C语言04
- Linux下VNC配置多个桌面和修改密码 不会当系统重启vnc失效
- 集合中存储自定义对象源代码
- Shader中颜色混合的算法
- bzoj 4566 找相同字符 —— 广义后缀自动机
- ajax设置自定义请求头信息
- 真格量化——中性策略交易期权
- 计算机网络之数据链路层:15、以太网、适配器、MAC地址
- 02 掌握变量的定义和使用方法 1214
- 洛谷P1978 集合 [2017年6月计划 数论08]
- Panoptic FPN-Panoptic Feature Pyramid Networks用于全景分割的特征金字塔网络
- 三维模型格式转换神器-assimp
- 注释一下blk_update_request函数
- iOS14:AirPods Auto Switching
- 安全的网络通道——网络准入之三层准入
- CC00388.CloudKubernetes——|KuberNetesCI/CD.V26|——|Jenkins.v06|自动构建Java应用.v06|报错处理|
- XSS插入绕过一些方式总结
- sqlserver远程连接mysql_sqlserver2005远程连接 mysql
- 让手机变成电脑摄像头
- 计算机键盘键盘一个按键坏了,我的世界:如果键盘坏掉一个键,六种情况,哪个会影响你玩MC?...
热门文章
- 没有Kubernets,学习Docker还有用吗?
- Azure 内容审查器之羞羞图审查
- 跟我一起学.NetCore之中间件(Middleware)简介和解析请求管道构建
- 世界上首个被数学证明安全的OS微内核seL4成立基金会
- 我的领域驱动设计运用实例 - 领域啊领域
- 鹅厂后台开发工程师的工作日常
- [翻译] .NET Core 3.0 Preview 9 发布
- 动手造轮子:基于 Redis 实现 EventBus
- EasyOffice-.NetCore一行代码导入导出Excel,生成Word
- 基于Jenkins Pipeline的ASP.NET Core持续集成实践