Java面试基础知识复习
1 JVM
1.1 谈谈你对Java的理解
可以从以下几个方面展开
- 平台无关: 即编译一次,可以运行在任何平台上
- GC(垃圾回收机制)
- 语言特性: 泛型,反射,lambda表达式
- 面向对象: 封装,继承,多态
- 类库: 数据库,IO
- 异常处理
1.2 平台无关性如何实现
答: 使用javac
命令将.java
文件编译成JVM可识别的字节码文件, 在你所要运行的平台上,安装上对应JVM,java
命令就可以运行这个字节码文件.也就是一次编译,任何地方可运行.总结
:Java源码首先被编译成字节码,再由不同平台的JVM进行解析,Java语言在不同平台上运行时不需要进行重新编译,Java虚拟机在执行字节码的时候,把字节码转换成具体平台上的机器指令.
扩展:
①javap
命令可反编译字节码文件
②为什么要编译成字节码,为什么不直接编译成机器指令呢?
答: 如果直接编译成机器指令,源码更换平台后,需要因为不同操作系统重新编译机器指令,重新检查语法,语义等重复性操作.所以-
1.3 什么是Java虚拟机
答: JVM(Java Virtual Machine)
,是一种抽象化的计算机机,通过在实际的计算机上仿真模拟计算机的各种功能来实现的,有自己完整硬件架构,如处理器,堆栈,寄存器和相应的指令系统.JVM
屏蔽了平台操作系统的相关信息,使得java程序只需生成可以在JVM
上运行的目标代码,即字节码,就可不加修改的在多种平台上运行.
注: JVM是一个内存中虚拟机
1.4 JVM如何加载.class文件
首先需要简单了解一下JVM构成
名称 | 说明 |
---|---|
Classloader | 依据特定格式,加载class文件到内存中 |
Runtime Data Area | JVM内存空间结构模型 |
Exection Engine | 对命令进行解析 |
Native Interface | 融合不同开发语言的原生库为Java所用(因为相对于C/C++来说,java运行比较慢) |
答: 加载器(Classloader)寻找到符合格式的.class文件并加载到内存(Runtime Data Area)中,然后解析器(Exection Engine)在内存中进行解析命令,处理数据,如果需要与异构系统交互通过本地接口(Native Interface)进行调用.
1.5 Java 反射
-
定义
:Java反射机制是在运行状态中.①对于任意一个类,都能够知道这个类的所有属性和方法;②对于任意一个对象,都能够调用它的任意方法和属性;③这种动态获取信息以及动态调用对象方法的功能 称为java语言的反射机制
. - 举例
package com.interview.javabasic.reflect;
public class Robot {
private String name;
public void sayHi(String helloSentence){
System.out.println(helloSentence+" "+name);
}
private String throwHello(String tag){
return "Hello " + tag;
}
}
package com.interview.javabasic.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectSample {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class rc = Class.forName("com.interview.javabasic.reflect.Robot");
Robot r = (Robot) rc.newInstance();
System.out.println("Class name is "+rc.getName());
//获取类中私有方法
Method getHello = rc.getDeclaredMethod("throwHello", String.class);
getHello.setAccessible(true);
Object str = getHello.invoke(r, "Bob");
System.out.println("getHello result is "+ str);
//获取类*有方法
Method sayHi = rc.getMethod("sayHi", String.class);
sayHi.invoke(r, "Welcome");
//获取类中私有属性
Field name = rc.getDeclaredField("name");
name.setAccessible(true);
name.set(r, "Alic");
sayHi.invoke(r, "Welcome");
}
}
输出结果
Class name is com.interview.javabasic.reflect.Robot
getHello result is Hello Bob
Welcome null
Welcome Alic
上面两个类,简单演示了反射中的一些函数.详细的讲解参考这个Java 反射由浅入深
上一篇: 自定义注解实现Excel导入导出
下一篇: 全局参数校验