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

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

  • 栈区

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

  • 堆区

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

  • 方法区

方法区用来存放程序中永远不变或唯一的内容,如类、静态变量、字符创常量等。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的初始化

初始化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从内存层面理解类和对象...相关推荐

  1. c# 如何找到项目中图片的相对路径

    c# 如何找到项目中图片的相对路径 string path = System.Environment.CurrentDirectory;//非Web程序 if (System.Environment. ...

  2. 写给还在迷茫中的朋友,一名6年程序员的工作感悟!!!

    前言 很多年前,刚刚从大学毕业的时候,很多公司来校招.其中最烂俗的一个面试问题是:"你希望你之后三到五年的发展是什么?".我当时的标准回答是(原话):"成为在某一方面能够 ...

  3. 百万英雄类答题游戏的程序员打开方式

    最近知识答题类的app应用和网站  都很火  所以机器人多了,,百度度秘.搜狗小汪等 Python发挥了很大作用 <百万英雄><冲顶大会><头脑王者><一站到 ...

  4. 我35岁,程序员,“中危”后帮别人规划人生

    35 岁,有妻有子,有房有车,但却没有上升空间了. 做程序员,35 岁是个"终极门槛",如果不能往上做管理,可能就要重新考虑是否需要转行--如果不主动考虑,也很可能被公司主动&qu ...

  5. 40岁的程序员还能找到工作吗_如果程序员已经到三十岁了,那他还能找到满意的工作吗?...

    作为已经快奔四的老程序员,看到话题就想吐槽两句,三十岁的程序员正好是黄金时期,无论从编程经验还是身体状态,都处于一个极佳的状态,虽然程序员喜欢通过互联网的方式吐糟自己,特别是大家都在吐槽程序员都是吃青 ...

  6. 39岁java程序员,待业中,对前途很迷茫,每天都很焦虑,不知道该怎么办?

    39岁java程序员,待业中,对前途很迷茫,每天都很焦虑,不知道该怎么办?第一次看到这个问题,觉得挺无奈的.39岁这个年纪,工作应该也有10多年,对于程序员岗位,如果平时没有放弃学习,相信专业技术能力 ...

  7. 挑战程序员同学,如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数?

    按位比较,比如先遍历一遍数字,判断第一位是0还是1多,然后便利多的那一位的数字,判断第二位是0还是1多,依次判断到第32位,就是出现次数最多的数字了 好吧,这个算法不对 我感觉这个题目是不是考的排序算 ...

  8. java 静态方法_80后程序员,教你学Java核心技术:用户自定义类+静态域静态方法

    用户自定义类 在第3章中,已经开始编写了一些简单的类.但是,那些类都只有一个简单的main方法.现在让我们开始学习如何设计复杂应用程序所需要的各种"主力类"(workhorse c ...

  9. 项目经验不丰富、技术不突出的程序员怎么打动面试官?

    前言 相信不少的程序员都有过类似的困惑:如果我没有大型的项目经历,也不能靠技术征服面试官,那我要怎么才能给面试官留下一个好印象呢? 按照本人的面试经验来说,面试主要看几点:项目经验+基本技术+个人潜力 ...

最新文章

  1. 数据类型,运算符和表达式03 - 零基础入门学习C语言04
  2. Linux下VNC配置多个桌面和修改密码 不会当系统重启vnc失效
  3. 集合中存储自定义对象源代码
  4. Shader中颜色混合的算法
  5. bzoj 4566 找相同字符 —— 广义后缀自动机
  6. ajax设置自定义请求头信息
  7. 真格量化——中性策略交易期权
  8. 计算机网络之数据链路层:15、以太网、适配器、MAC地址
  9. 02 掌握变量的定义和使用方法 1214
  10. 洛谷P1978 集合 [2017年6月计划 数论08]
  11. Panoptic FPN-Panoptic Feature Pyramid Networks用于全景分割的特征金字塔网络
  12. 三维模型格式转换神器-assimp
  13. 注释一下blk_update_request函数
  14. iOS14:AirPods Auto Switching
  15. 安全的网络通道——网络准入之三层准入
  16. CC00388.CloudKubernetes——|KuberNetesCI/CD.V26|——|Jenkins.v06|自动构建Java应用.v06|报错处理|
  17. XSS插入绕过一些方式总结
  18. sqlserver远程连接mysql_sqlserver2005远程连接 mysql
  19. 让手机变成电脑摄像头
  20. 计算机键盘键盘一个按键坏了,我的世界:如果键盘坏掉一个键,六种情况,哪个会影响你玩MC?...

热门文章

  1. 没有Kubernets,学习Docker还有用吗?
  2. Azure 内容审查器之羞羞图审查
  3. 跟我一起学.NetCore之中间件(Middleware)简介和解析请求管道构建
  4. 世界上首个被数学证明安全的OS微内核seL4成立基金会
  5. 我的领域驱动设计运用实例 - 领域啊领域
  6. 鹅厂后台开发工程师的工作日常
  7. [翻译] .NET Core 3.0 Preview 9 发布
  8. 动手造轮子:基于 Redis 实现 EventBus
  9. EasyOffice-.NetCore一行代码导入导出Excel,生成Word
  10. 基于Jenkins Pipeline的ASP.NET Core持续集成实践