Java基础面试题
基础
JDK、JRE、JVM是什么?
JDK 即为 Java 开发工具包,包含编写 Java 程序所必须的编译、运行等开发工具以及 JRE。开发工具如:
- 用于编译 Java 程序的 javac 命令。
- 用于启动 JVM 运行 Java 程序的 Java 命令。
- 用于生成文档的 Javadoc 命令。
- 用于打包的 jar 命令等等。
JRE 即为 Java 运行环境,提供了运行 Java 应用程序所必须的软件环境,包含有 Java 虚拟机(JVM)和丰富的系统类库。系统类库即为 Java 提前封装好的功能类,只需拿来直接使用即可,可以大大的提高开发效率。
JVM 即为 Java 虚拟机,提供了字节码文件(.class)的运行环境支持。
机器码与字节码的区别
字节码是一种包含执行程序、由一系列操作码和数据对组成的二进制文件。
字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能称为机器码。
数据类型与程序结构
String、StringBuffer、StringBuilder的区别?
- String ,是只读字符串,也就意味着 String 引用的字符串内容是不能被改变的。
- StringBuffer/StringBuilder 类,表示的字符串对象可以直接进行修改。StringBuilder 是 Java 5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被 synchronized 修饰,因此它的效率也比 StringBuffer 要高。
什么是自动拆箱装箱?
自动装箱和拆箱,就是基本类型和引用类型之间的转换。
自动装箱拆箱可以让我们的代码更简练:在Java5之前,集合中不能存入原始类型的值,因为集合只接收对象。
final、finally、finalize 的区别?
- final:final ,是修饰符关键字。 如果一个类被声明为 final ,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract 的,又被声明为 final 的。将变量或方法声明为 final ,可以保证它们在使用中不被改变。被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final 的方法也同样只能使用,不能重写。
- finally:在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。但是在以下特殊情况中,finally块不会被执行: 在前面的代码中用了 System.exit() 退出程序。程序所在的线程死亡。
- finalize:finalize是方法名。Java 允许使用 #finalize() 方法,在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。
java程序的结构?
- 顺序结构
- 选择结构:if else
- 循环结构: while、do while、for
值传递与引用传递的区别?
在方法调用时,通常需要传递一些参数来完成特定的功能。Java语言提供了两种参数传递的方式:值传递与引用传递。
- 值传递:在方法调用中,实参会把它的值传递给形参,形参只是实参的值初始化一个临时的存储单元,因此形参与实参虽然有着相同的值,但是却有着不同的存储单元,因此对形参的改变不会影响实参的值。
- 引用传递:在方法调用中,传递的是对象,这时形参与实参的对象指向同一块存储单元,因此对形参的修改就会影响实参的值。
如何实现main()方法执行前执行代码块
在Java语言中,由于静态块在类被加载时就会被调用,因此可以在main()方法执行前,利用静态块实现输出"hello world"的功能。
由于静态块不管顺序如何,都会在main()方法之前执行,因此,即使static代码块写在main()方法之后,它都依然在main()方法之前执行。
面向对象
什么是面向对象?
面向对象是一种思想,世间万物都可以看做一个对象。面向对象软件开发具有以下优点:
- 代码开发模块化,更易维护和修改。
- 代码复用性强。
- 增强代码的可靠性和灵活性。
- 增加代码的可读性。
面向对象的特征?
封装、继承、多态、抽象。
java类的定义/组成?
- 类的定义由访问级别、类型、类名、是否抽象、是否静态、泛型标识、继承或实现关键字、父类或接口名称等组成。
- 类的访问级别有public和无访问控制符。
- 类的类型为class、interface、enum。
相关demo:System.out.println();
语句不写在方法内会报错。
public class Test{ public static void main(String[] args){ System.out.println("Hello World"); } System.out.println("Hello World");//此处编译器报错 }
== equals()
- ==比较 基本类型:比较的就是值是否相同。引用类型:比较的就是地址值是否相同。
- equals: 引用类型:默认情况下,比较的是地址值。两个对象的hashCode相同,equals方法不一定为true。
Java后端专栏 文章被收录于专栏
[持续更新中,有问题可以私信我] Java、Spring、数据库、缓存、消息队列、微服务