普歌-允异团队-【Java知识点】这些Java学习路上你必须知道的原理(1),Java面试考点!!!Java类加载的机制/static、final关键字/堆、栈

【Java知识点】面试中会问到的那些小知识(1)

前言

本文与之后的几篇文章将是某整理的学习笔记,在此与诸位分享


以下是本篇文章正文内容,该系列会持续更新,敬请关注。

一、Java类加载的机制

- 类加载的机制

  • Java编译器将.java文件编译成扩展名为.class的文件
  • .class文件中保存着java转换后虚拟机将要执行的指令
  • 当需要这个类时,Java虚拟机会加载.class文件,并创建对应的class对象,将class文件加载到虚拟机的内存

- 类加载的过程
加载 - -> 验证 - -> 准备 - -> 解析 - -> 初始化

  • 加载:
    类加载的一个过程,ClassLoader通过一个类的完全限定名查找此类字节码文件,并利用字节码文件创建一个class对象
  • 验证:
    目的在于确保class文件的字节流中包含信息符合当前虚拟机的要求,不会危害虚拟机自身安全
    • 这里主要包括四种验证:文件格式的验证,元数据的验证,字节码的验证,符号引用的验证
  • 准备:
    为类变量(static修饰的字段变量)分配内存并且设置该类变量的初始值
    • 这里不包含final修饰的static,因为final在编译的时候就已经分配了
    • 这里不会为实例变量分配初始化,类变量会分配在方法区中,实例变量会随着对象分配到Java堆中
  • 解析:
    这里主要的任务是把常量池中的符号引用替换成直接引用
  • 初始化:
    这里是类记载的最后阶段,如果该类具有父类就进行对父类初始化,执行其静态初始化器(静态代码块)或静态初始化成员变量

二、关键字

在Java学习中有很多关键字需要我们掌握,这里暂时只举例static和final关键字。

- static

  • static是一个修饰符,用于修饰类的成员方法、类的成员变量,另外编写static代码块来优化程序性能
  • static修饰变量时
    • 被static修饰的成员变量属于类,不属于某一个对象
    • 被static修饰的成员变量也可以通过类名来访问
  • 注意事项
    static关键字用来形成静态代码块以优化程序性能
    • 静态只能访问静态
    • 非静态既可以访问非静态,也可以访问静态

- final
final关键字代表最终、不可改变的。

  • final可以用来修饰一个类
    一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写
  • final可以用来修饰成员方法
    当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写
    • 对于类、方法来说,abstract关键字和final关键字不能同时使用,因为二者是矛盾的
  • final可以修饰局部变量
    一旦使用final来修饰局部变量,那么这个变量就不能进行改变
    • 对于基本类型来说,其数值一旦在初始化之后便不能更改
    • 对于引用类型来说,在对其初始化之后便不能再让其指向另一个对象,但其引用的值是可变的,即地址值不可变。
  • 这里某有一个有意思的解释,对于被final修饰的引用数据类型,就像结婚之后,引用类型数据可以改变自身,变胖或变瘦都无所谓,但唯一要求的是不能与其他对象再次结婚,这就是引用值可变但不可指向另一个对象。
  • final可以修饰成员变量
    对于成员变量来说,如果使用final关键字修饰,那么这个变量也照样是不可改变的

在这里有一个容易混淆的地方,即final与finally的区别

  • final作为关键字用来修饰限定
  • finally则是异常中与try-catch配套的一条语句,它的作用是用来执行无论是否出现异常都会执行的语句

综上,final是最终修饰符static是静态修饰符,那么static和final可以一起使用吗?
答案是肯定的。

  • static修饰的时候代表对象是静态的
  • final修饰的时候代表对象只能赋值一次
  • 他们连用时是因为被定义的对象要求既是静态的,同时还要求它的值不能再被修改
  • 简言之,当一个常数或字符串是我们需要在程序里反复使用时,我们就可以把它定义为static final,这样内存就不会重复申请和释放空间

三、堆、栈

堆栈是JVM中比较重要的一块内容,完整的JVM内存包括:
Java堆、Java栈、元空间(方法区)、本地方法栈、程序计数器(PC寄存器)
在本文中暂且只对堆和栈做概述

  • 堆是动态的,用于动态分配内存
  • 每当我们创建(new)任何对象时,它总是在堆空间中创建
  • 用于执行线程,存放程序中的方法体(栈帧)
  • 每个线程都会有一个私有的栈,每个线程中方法的调用又会在本栈中创建一个栈帧
  • 每一个栈帧的数据大小与生命周期都必须是确定的,因此栈相对来说缺乏灵活性
  • 栈帧遵循先进后出的原则,在JVM中对Java栈只进行两种操作——压栈和弹栈

参考文章

static
Java类加载机制
JVM内存结构组成
JVM内存结构和Java内存模型
操作系统,堆栈(stack),堆(heap),详解

同时也推荐看看这些文章
普歌-逆越团队:Java基础知识点(运行背景,程序开发三步骤,入门知识点)


至此文章就结束啦,欢迎在评论区留言
同时也祝看完本篇的你在未来的时间里收获更多知识!

  • 作者:CEMER216
  • 本文版权归作者和CSDN共有,欢迎转载,且在文章页面明显位置给出原文链接,未经作者同意必须保留此段声明,否则保留追究法律责任的权利。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
2019最新深入理解JVM内存结构及运行原理JVM调优)高级核心课程视频教程下载。JVMJava知识体系中的重要部分,对JVM底层的了解是每一位Java程序员深入Java技术领域的重要因素。本课程试图通过简单易懂的方式,系统的深入讲解JVM相关知识。包括JVM执行过程、虚拟机类加载机制、运行时数据区、GC、类加载器、内存分配与回收策略等,全套视频加资料高清无密码  第1讲 说在前面的话 免费 00:05:07  第2讲 整个部分要讲的内容说明 免费 00:06:58  第3讲 环境搭建以及jdk,jre,jvm的关系 免费 00:20:48  第4讲 jvm初体验-内存溢出问题的分析与解决 免费 00:17:59  第5讲 jvm再体验-jvm可视化监控工具 免费 00:21:17  第6讲 杂谈 免费 00:12:37  第7讲 Java的发展历史 00:27:24  第8讲 Java的发展历史续 00:02:27  第9讲 Java技术体系 00:08:46  第10讲 jdk8的新特性 00:07:31  第11讲 lanmbda表达式简介 00:07:02  第12讲 Java虚拟机-classic vm 00:06:06  第13讲 Java虚拟机-ExactVM 00:03:35  第14讲 Java虚拟机-HotSpotVM 00:04:23  第15讲 Java虚拟机-kvm 00:03:04  第16讲 Java虚拟机-JRockit 00:04:12  第17讲 Java虚拟机-j9 00:04:23  第18讲 Java虚拟机-dalvik 00:02:20  第19讲 Java虚拟机-MicrosoftJVM 00:03:57  第20讲 Java虚拟机-高性能Java虚拟机 00:02:58  第21讲 Java虚拟机-TaobaoVM 00:03:06  第22讲 Java内存区域-简介 00:07:56  第23讲 Java内存区域-Java虚拟机 00:12:04  第24讲 Java内存区域-程序计数器 00:12:54  第25讲 Java内存区域-本地方法 00:02:39  第26讲 Java内存区域-内存 00:05:08  第27讲 Java内存区域-方法区 00:06:32  第28讲 Java内存区域-直接内存和运行时常量池 00:15:53  第29讲 对象在内存中的布局-对象的创建 00:21:19  第30讲 探究对象的结构 00:13:47  第31讲 深入理解对象的访问定位 00:08:01  第32讲 垃圾回收-概述 00:06:20  第33讲 垃圾回收-判断对象是否存活算法-引用计数法详解 00:14:08  第34讲 垃圾回收-判断对象是否存活算法-可达性分析法详解 00:07:09  第35讲 垃圾回收算法-标记清除算法 00:04:36  第36讲 垃圾回收算法-复制算法 00:14:35  第37讲 垃圾回收算法-标记整理算法和分代收集算法 00:05:24  第38讲 垃圾收集器-serial收集器详解 00:09:45  第39讲 垃圾收集器-parnew收集器详解 00:04:53  第40讲 垃圾收集器-parallel收集器详解 00:11:02  第41讲 垃圾收集器-cms收集器详解 00:14:58  第42讲 最牛的垃圾收集器-g1收集器详解 00:18:04  第43讲 内存分配-概述 00:04:23  第44讲 内存分配-Eden区域 00:22:51  第45讲 内存分配-大对象直接进老年代 00:06:42  第46讲 内存分配-长期存活的对象进入老年代 00:03:40  第47讲 内存分配-空间分配担保 00:04:54  第48讲 内存分配-逃逸分析与上分配 00:10:32  第49讲 虚拟机工具介绍 00:10:27  第50讲 虚拟机工具-jps详解 00:11:20  第51讲 虚拟机工具-jstat详解 00:09:20  第52讲 虚拟机工具-jinfo详解 00:05:03  第53讲 虚拟机工具-jmap详解 00:08:48  第54讲 虚拟机工具-jhat详解 00:08:10  第55讲 虚拟机工具-jstack详解 00:10:19  第56讲 可视化虚拟机工具-Jconsole内存监控 00:07:09  第57讲 可视化虚拟机工具-Jconsole线程监控 00:12:18  第58讲 死锁原理以及可视化虚拟机工具-Jconsole线程死锁监控 00:10:38  第59讲 VisualVM使用详解 00:08:03  第60讲 性能调优概述 00:11:22  第61讲 性能调优-案例1 00:23:28  第62讲 性能调优-案例2 00:10:05  第63讲 性能调优-案例3 00:12:41  第64讲 前半部分内容整体回顾 00:15:41  第65讲 Class文件简介和发展历史 免费 00:11:26  第66讲 Class文件结构概述 免费 00:16:50  第67讲 Class文件设计理念以及意义 免费 00:13:41  第68讲 文件结构-魔数 免费 00:09:49  第69讲 文件结构-常量池 免费 00:23:44  第70讲 文件结构-访问标志 免费 00:11:36  第71讲 文件结构-类索引 00:11:26  第72讲 文件结构-字段表集合 00:13:21  第73讲 文件结构-方法表集合 00:10:06  第74讲 文件结构-属性表集合 00:18:23  第75讲 字节码指令简介 00:09:18  第76讲 字节码与数据类型 00:09:34  第77讲 加载指令 00:09:33  第78讲 运算指令 00:10:24  第79讲 类型转换指令 00:13:42  第80讲 对象创建与访问指令 00:09:38  第81讲 操作树指令 00:03:27  第82讲 控制转移指令 00:11:58  第83讲 方法调用和返回指令 00:06:37  第84讲 异常处理指令 00:09:44  第85讲 同步指令 00:07:34  第86讲 类加载机制概述 00:07:26  第87讲 类加载时机 00:13:15  第88讲 类加载的过程-加载 00:15:15  第89讲 类加载的过程-验证 00:10:24  第90讲 类加载的过程-准备 00:05:40  第91讲 类加载的过程-解析 00:14:04  第92讲 类加载的过程-初始化 00:19:41  第93讲 类加载器 00:22:41  第94讲 双亲委派模型 00:17:03  第95讲 运行时帧结构 00:08:46  第96讲 局部变量表 00:20:48  第97讲 操作数 00:08:36  第98讲 动态连接 00:02:56  第99讲 方法返回地址和附加信息 00:03:24  第100讲 方法调用-解析调用 00:09:49  第101讲 方法调用-静态分派调用 00:16:21  第102讲 方法调用-动态分派调用 00:09:02  第103讲 动态类型语言支持 00:09:27  第104讲 字节码执行引擎小结 00:03:38  第105讲 总结与回顾 00:10:55  第106讲 happens-before简单概述 00:15:17  第107讲 重排序问题 00:23:19  第108讲 锁的内存语义 00:13:54  第109讲 volatile的内存语义 00:12:04  第110讲 final域内存语义

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值