JAVA面试精华:final, finally, finalize与匿名内部类详解

需积分: 6 2 下载量 46 浏览量 更新于2024-08-02 收藏 37KB DOC 举报
在JAVA程序员面试过程中,面试官可能会询问一系列深入的Java概念和技术细节。以下是部分关键问题及其详细解释: 1. **final, finally, finalize的区别**: - `final`关键字用于修饰变量、方法或类,表示变量不可变(常量)、方法不可重写或类不可实例化。 - `finally`通常用于`try-catch-finally`块,确保代码无论是否出现异常都会执行的清理操作。 - `finalize()`是Java对象生命周期中的一个特殊方法,当垃圾回收器确定对象不再被引用时调用,用于执行资源清理,但并不是所有对象都能被调用,也不是一种推荐的实践。 2. **匿名内部类**: - 可以通过`extends`关键字继承其他类,但只能实现一个接口,这是因为匿名类没有名字,无法作为独立的类实例存在。 3. **StaticNestedClass与InnerClass**: - Static Nested Class(静态嵌套类)是完全独立于外部类的类,它有自己的作用域,可以在不实例化外部类的情况下使用。 - Inner Class(非静态嵌套类)是属于外部类的一部分,有访问外部类成员的权限,分为静态和非静态两种类型。 4. **& vs. &&**: - `&`是位运算符,进行按位与操作,适用于整数,而`&&`是逻辑与运算符,用于布尔表达式判断,只有当两者都为真时结果才为真。 5. **HashMap与Hashtable**: - HashMap是非线程安全的,提供更快的查找速度,允许null键值对。 - Hashtable是线程安全的,性能稍低,禁止null键值对。 6. **Collection与Collections**: - Collection是基础接口,代表集合类的通用行为。 - Collections是Java集合框架的工具类,提供各种对集合的操作方法,如排序、查找等。 7. **assert**: - 用于在开发环境中检查条件,编译时不检查,运行时如果条件为假则抛出AssertionError,有助于发现潜在错误。 8. **GC(Garbage Collection)**: - 是Java自动内存管理机制,负责回收不再使用的对象所占用的内存,避免内存泄漏。 9. **String创建和length()方法**: - `Strings = new String("xyz")` 创建了一个新的String对象,即使字符串相同,也会创建新对象。 - `Math.round()` 方法根据四舍五入规则返回最接近的整数,`11.5` 返回12,`-11.5` 返回-12。 10. **基本数据类型和运算**: - `shorts1 = 1; s1 = s1 + 1;` 有编译错误,因为短整型加1会溢出,应使用`s1 += 1`。 11. **sleep() vs. wait()**: - sleep()使当前线程睡眠指定时间,阻塞自己;wait()让当前线程等待其他线程唤醒。 12. **Java中的goto语句**: - Java已经移除了传统的`goto`语句,转而使用`break`和`continue`控制流程。 13. **数组和String的length()方法**: - 数组有`length`属性,返回数组长度,String也有`length`方法,返回字符串中字符的数量。 14. **Overload和Override**: - Overload是重载,指同一个类中有多个同名方法但参数列表不同。 - Override是重写,子类方法覆盖父类方法,必须保持相同的签名(包括返回类型)。 15. **Set和equals()的使用**: - Set不允许重复元素,使用equals()方法比较元素内容是否相等,而非`==`,因为equals方法还可以处理自定义对象的相等性。 16. **常见运行时异常**: - 如`NullPointerException`, `ArrayIndexOutOfBoundsException`, `IOException`等。 17. **Error和Exception的区别**: - Error是严重问题,通常由JVM或硬件错误引起,无法恢复,而Exception是预期的程序错误,可以被捕获和处理。 18. **集合接口继承关系**: - List, Set, Map都继承自Collection接口。 19. **抽象类与接口的区别**: - AbstractClass可以包含字段和方法实现,接口只定义方法,且方法默认是public abstract。 - 类可以实现多个接口,但只能继承一个抽象类。 20. **抽象方法的特性**: - 不能同时声明为static、native或synchronized。 21. **接口和继承的限制**: - 接口不能继承接口,但可以继承抽象类;抽象类可以实现接口,也可以继承实体类。 22. **线程启动方式**: - 启动线程使用`start()`方法,调用run()方法只是执行线程体,不会启动新线程。 23. **构造器重写**: - 构造器不能被重写,但可以通过继承父类构造器并添加额外初始化逻辑来扩展。 24. **String类不可继承**: - Java中不能直接继承String类,但可以使用StringBuffer或StringBuilder来实现类似功能。 25. **线程同步和阻塞**: - 当一个线程进入一个同步代码块或方法时,其他试图进入的线程将被阻塞,直到前一个线程释放锁。