"Java面试宝典是一本针对Java程序员面试准备的资料,涵盖了常见的Java面试问题,包括面向对象、语法特性、数据结构、算法、内存管理、类库使用等多个方面。"
1. **Java基础**
- `super()` 和 `this()` 的区别:`super()` 用于调用父类的构造器,而 `this()` 用于在子类构造器中调用本类的其他构造器。
2. **访问修饰符**
- `public`, `protected`, `private` 及默认访问权限的区别:`public` 可以在任何地方访问,`protected` 在同一包或子类中可访问,`private` 只能在本类中访问,而默认权限在同一包内可访问。
3. **图形输出**
- 这个面试题可能涉及使用循环和控制语句在控制台打印特定的字符组合以形成图形。
4. **事件委托和垃圾回收**
- Java的事件委托机制是指通过事件监听器处理用户交互,垃圾回收机制则是自动回收不再使用的对象以释放内存。
5. **跳出多重循环**
- 使用 `break` 关键字可以跳出最内层循环,`break label;` 可以跳出指定标签的循环。
6. **Java序列化**
- Java序列化是将对象的状态转化为字节流的过程,通过实现 `Serializable` 接口实现。示例代码通常会包含 `ObjectOutputStream` 和 `ObjectInputStream` 的使用。
7. **源文件与类的关系**
- 一个`.java`源文件可以包含多个类,但只能有一个公开的类(`public class`),这个公开的类名必须与文件名相同。
8. **排序方法与快速排序**
- 排序方法包括冒泡排序、选择排序、插入排序、快速排序等,快速排序是一种高效的分治算法,面试中可能会要求手写实现。
9. **重载与覆盖**
- 重载(Overload)是方法名相同但参数列表不同的方法,而覆盖(Override)是子类重新定义父类已有的方法,返回值类型改变不能构成覆盖。
10. **Final类**
- Final类不能被继承,提供最终实现。
11. **继承执行顺序**
- 初始化成员变量和构造器的调用顺序遵循一定的规则,包括静态变量、非静态变量和构造器的执行。
12. **内部类**
- 内部类包括成员内部类、局部内部类、匿名内部类和静态内部类,各有其应用场景和特性。
13. **序列化实现**
- 除了实现 `Serializable` 接口,还可以使用 `writeObject()` 和 `readObject()` 方法自定义序列化和反序列化行为。
14. **Comparable和Comparator接口**
- 在集合框架中,实现 `Comparable` 接口使得类的实例可以进行自然排序,而 `Comparator` 接口用于定制排序逻辑。
15. **插入排序代码**
- 插入排序是一种简单的排序算法,面试中可能需要手写代码实现。
16. **字符串截取函数**
- 这个问题涉及到字符串处理,确保截取时不分割汉字,可能需要考虑字符编码。
17. **时间操作**
- 打印昨天的当前时刻、文件读写和计数器的实现都涉及到Java的日期和时间API,如 `java.util.Calendar` 和 `java.time` 包。
18. **抽象类与接口**
- 抽象类可以有方法实现,可以包含非抽象方法,而接口只有方法声明,不能有实现。
19. **反射机制**
- 类的反射机制允许在运行时检查和操作类的属性、方法和构造器。
20. **反射的核心类**
- 如 `Class` 类,`Constructor`,`Method` 和 `Field`,它们提供了对类元信息的访问。
21. **获取Class对象的三种方式**
- 通过类名使用 `Class.forName()`, 通过对象的 `getClass()` 方法,或者类的 `.class` 常量。
22. **调用类方法**
- 使用 `Class` 对象的 `getMethod()` 或 `getDeclaredMethod()` 获取方法,然后调用 `invoke()` 方法执行。
23. **字符与数字转换**
- `Integer.parseInt()` 和 `Double.parseDouble()` 将字符串转换为整数和双精度浮点数。
24. **数字转换为字符**
- `Character.toString()` 可将数字转换为对应的字符。
25. **去小数点前两位并四舍五入**
- 使用 `DecimalFormat` 或 `BigDecimal` 进行格式化操作。
26. **获取日期时间**
- 使用 `java.util.Date` 和 `java.time` 包中的类获取年月日、小时分秒。
27. **获取从1970至今的毫秒数**
- `System.currentTimeMillis()` 返回自1970年以来的毫秒数。
28. **获取当月最后一天**
- 使用 `java.time` 中的 `YearMonth` 或 `TemporalAdjusters.lastDayOfMonth()`。
这些知识点都是Java面试中常见的问题,准备面试时应深入理解并能熟练应用。