欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java面试基础知识复习

程序员文章站 2022-04-25 20:01:29
...

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构成
Java面试基础知识复习

名称 说明
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 反射由浅入深

相关标签: 求职笔记