普歌-允异团队-【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与finally的区别

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

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

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

三、堆、栈

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

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

参考文章

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

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


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

  • 作者:CEMER216
  • 本文版权归作者和CSDN共有,欢迎转载,且在文章页面明显位置给出原文链接,未经作者同意必须保留此段声明,否则保留追究法律责任的权利。

猜你喜欢

转载自blog.csdn.net/weixin_51978362/article/details/115370970