youyichannel

志于道,据于德,依于仁,游于艺!

0%

Java基础知识(面试题)

Java基础知识,很重要!!!

JDK和JRE和JVM分别是什么,有什么区别?

  1. JDK(Java Development Kit):JDK 是 Java 开发工具包,包含了编写、编译、调试和运行 Java 程序所需的所有工具和组件,比如编译器(javac)、Java API、调试工具等。 JDK 是针对 Java 开发人员的,它包含了 JRE,还有编译器和其他工具,可以用来编写和 调试 Java 程序。
  2. JRE(Java Runtime Environment):JRE 是 Java 运行时环境,包括了 Java 虚拟机 (JVM)和 Java 标准类库(Java API)。JRE 是针对 Java 应用程序的,它提供了在计算机上运行 Java 应用程序所需的最小环境
  3. JVM(Java Virtual Machine):JVM 是 Java 虚拟机,是 Java 程序运行的环境。JVM负责将 Java 代码解释或编译为本地机器代码,并在运行时提供必要的环境支持,比如内存管理、垃圾回收、安全性等。JVM 的主要作用是将 Java 代码转换为可以在计算机上运行的机器码,并负责程序的执行

总结

  • JDK 是 Java 开发工具包,包括了编译器、Java API、调试工具等,用于开发 Java 应用程序
  • JRE 是 Java 运行时环境,包括了 Java 虚拟机和 Java 标准类库,用于在计算机上运行 Java 应用程序
  • JVM 是 Java 虚拟机,是 Java 程序运行的环境,负责将 Java 代码转换为可以在计算机上运行的机器码,并提供必要的环境支持
  • Java开发工具包 = Java 运行环境 + Java开发工具
  • Java 运行环境= Java虚拟机 + Java核心类库

补充

1)JVM 并不是只有一种!只要满足 JVM 规范,每个公司、组织或者个人都可以开发自己的专属 JVM

2)Java 程序是如何在计算机上运行的:

  1. 编写Java源代码 => 需要用到JDK
  2. 将Java源代码编译成字节码 => 需要用到Java开发工具包中的编译器(javac),产生字节码文件
  3. 将字节码转换成机器码 => 需要用到 JVM
  4. 操作系统执行机器码,完成程序的运行 => 需要用到JRE

什么是字节码?采用字节码的最大好处是什么?

字节码是Java程序编译后的中间代码,是一种可移植的二进制代码,可以在任何支持Java虚拟机(JVM)的平台上运行。字节码通过将Java源代码编译为字节码指令序列,使得Java程序可以跨平台运行,即使是在不同的操作系统和硬件平台上也可以运行。

字节码采用中间代码的形式,相比于直接将程序编译为特定平台上的机器码,有以下几个好处:

  1. 可移植性:由于字节码是中间代码,所以可以在任何支持JVM的平台上运行,使得Java程序具有很好的移植性。这也是Java跨平台的重要特性之一。
  2. 安全性:由于字节码需要在JVM中运行,所以可以对字节码进行安全检查,以确保程序不会对系统造成威胁。
  3. 性能:由于字节码是一种紧凑的二进制格式,相比于直接编译为机器码,可以更快地加载和传输,同时也可以在运行时进行动态优化,提高程序的执行效率。
  4. 可读性:相比于直接编译为机器码,字节码具有更好的可读性,可以方便地进行反汇编和调试。

因此,采用字节码作为中间代码的最大好处是提高了 Java 程序的可移植性、安全性、性能和可读性。这也是 Java 跨平台和安全性等特性的基础。

补充

什么是Java内部类,内部类的分类有哪些?有哪些优点和应用场景?

定义

内部类:定义在某一个类中的类。

分类、优点、应用场景

分类:

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类
分类 定义 作用范围 应用场景
成员内部类 与其外部类的其他成员变量和方法平级的内部类 可以访问外部类的所有成员变量和方法,可以被外部类访问 为外部类提供服务的场景
静态内部类 使用static关键字修饰的内部类 只能访问外部类的静态成员和静态方法,只能被外部类的静态方法访问 与外部无关或者需要单例模式的场景
局部内部类 定义在方法中的内部类,在方法中直接实例化 可以访问外部类或者代码块中声明为final的变量,作用于仅限在方法内部,不能使用访问控制符修饰 执行特定任务或者逻辑操作场景
匿名内部类 没有名字的内部类,使用new 接口(){}或者抽象类(){}或者new 父类(){} 没有名字,没有构造器,只能使用一次,必须集成一个父类型(接口或者抽象类)或者实现一个接口的局部内部类 创建回调函数、事件监听、线程等临时对象

创建与获取:

// 1. 私有内部类 => 在外部类中编写方法,对外提供内部类对象
// 定义方法(外部类中)
public Inner getInstance() {
return new Inner();
}

// 使用方法
Outer o = new Outer();
Object i = o.getInstance();

// 2. 非私有内部类 => 直接创建成员内部类
// [OuterClass.InnerClass obj = new OuterClass().new Inner()]
Outer.Inner oi = new Outer().new Inner();

优点:

  • 通过内部类变相实现多继承,使得一个类可以假性地继承多个父类
  • 内部类可以隐藏实现细节,简化代码的编写
  • 内部类可以访问外部类的私有成员变量和方法,从而增加了程序的灵活性和安全性

反射机制、优缺点、应用场景

Java反射机制是指在运行时动态获取类的信息、创建对象以及调用对象的属性和方法的机制。

优点:

  • 可以动态地获取类的信息,不需要在编译时就知道类的信息。
  • 可以动态地创建对象,不需要在编译时就知道对象的类型。
  • 可以动态地调用对象的属性和方法,可以在运行时动态地改变对象的行为。

缺点:

  • 由于反射是动态的,所以它的运行效率较低,不如直接调用方法或属性。
  • 由于反射是动态的,所以它会破坏 Java 的封装性,可能会使代码变得复杂和不稳定。

应用场景

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的成员变量和方法
  • 在运行时处理注解
  • 生成动态代理

补充哪些框架或者自己的哪些项目用到了反射,会是亮点