【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可以一起使用吗?
答案是肯定的。
- static修饰的时候代表对象是静态的
- final修饰的时候代表对象只能赋值一次
- 他们连用时是因为被定义的对象要求既是静态的,同时还要求它的值不能再被修改
- 简言之,当一个常数或字符串是我们需要在程序里反复使用时,我们就可以把它定义为static final,这样内存就不会重复申请和释放空间
三、堆、栈
堆栈是JVM中比较重要的一块内容,完整的JVM内存包括:
Java堆、Java栈、元空间(方法区)、本地方法栈、程序计数器(PC寄存器)
在本文中暂且只对堆和栈做概述
- 堆
- 堆是动态的,用于动态分配内存
- 每当我们创建(new)任何对象时,它总是在堆空间中创建
- 栈
- 用于执行线程,存放程序中的方法体(栈帧)
- 每个线程都会有一个私有的栈,每个线程中方法的调用又会在本栈中创建一个栈帧
- 每一个栈帧的数据大小与生命周期都必须是确定的,因此栈相对来说缺乏灵活性
- 栈帧遵循先进后出的原则,在JVM中对Java栈只进行两种操作——压栈和弹栈
参考文章
static
Java类加载机制
JVM内存结构组成
JVM内存结构和Java内存模型
操作系统,堆栈(stack),堆(heap),详解
同时也推荐看看这些文章
普歌-逆越团队:Java基础知识点(运行背景,程序开发三步骤,入门知识点)
- 作者:CEMER216
- 本文版权归作者和CSDN共有,欢迎转载,且在文章页面明显位置给出原文链接,未经作者同意必须保留此段声明,否则保留追究法律责任的权利。