"Java面试宝典"
这是一份详尽的Java面试指南,涵盖了Java基础知识的各个方面,旨在帮助求职者准备面试。以下是其中的关键知识点:
1. 一个".java"源文件可以包含多个类,但只能有一个公共类(public class),其他类可以是非公共的,没有公共类限制。
2. Java语言中没有`goto`关键字,它是一种控制流程转移的语句,但在Java中不被支持。
3. `&`和`&&`都是逻辑运算符。`&`始终计算两边的操作数,而`&&`是短路运算符,如果第一个操作数为假,则不会计算第二个操作数。
4. 要跳出多重嵌套循环,可以使用`break`语句配合标签来实现。
5. `switch`语句不能作用于`byte`、`long`或`String`类型,但Java 7及以后版本可以用于`String`。
6. `short s1 = 1; s1 = s1 + 1;`会触发编译错误,因为结果是`int`类型,需要显式转换。`s1 += 1;`是正确的,因为编译器会自动处理类型提升。
7. `char`型变量可以存储单个Unicode字符,因此可以存储中文汉字。
8. 计算2乘以8最有效的方法是直接使用`*`运算符:`2 * 8`。
9. 设计一个能处理一百亿数值的计算器要考虑大数运算和性能优化。
10. `final`修饰变量时,意味着变量一旦赋值就不能再次改变,如果是引用类型,引用本身不可变,但引用的对象可以变。
11. `==`比较的是对象的引用,而`equals()`方法比较的是对象的内容。基本类型用`==`,对象用`equals()`。
12. 静态变量属于类,实例变量属于类的每个实例。静态变量在类加载时初始化,实例变量在对象创建时初始化。
13. 不能从`static`方法内部直接调用非`static`方法,因为`static`方法与对象无关。
14. `Integer`是`int`的包装类,它们之间主要区别在于`Integer`是对象,`int`是基本类型,`Integer`支持方法调用。
15. `Math.round(x)`会四舍五入到最近的整数,`Math.round(11.5)`等于12,`Math.round(-11.5)`等于-11。
16. 代码不妥之处可能涉及类型转换、异常处理、效率优化等问题,需具体分析代码内容。
17. `public`、`private`、`protected`分别代表访问权限,`public`可从任何地方访问,`private`只能在本类访问,`protected`在同一包内和子类中可见,无修饰符代表包内可见。
18. `Overload`是重载,方法名相同但参数列表不同;`Override`是重写,子类方法覆盖父类方法,返回值类型、方法名和参数列表必须完全一致。
19. 构造器`Constructor`不能被`override`,但可以被重载。
20. 接口可以继承接口,抽象类可以实现接口,抽象类可以继承具体类,抽象类中可以有静态的`main`方法,但不能作为程序入口。
21. 写`clone()`方法时,通常会有一行代码调用`super.clone()`,以实现浅复制。
22. 面向对象的特征包括封装、继承和多态。
23. Java通过方法的动态绑定实现多态,即运行时根据对象的实际类型调用相应的方法。
24. `abstract class`可以包含方法实现,而`interface`只定义方法签名,不能包含方法实现。`abstract class`可以有构造器,`interface`不能。
25. `abstract`的`method`不能同时是`static`,不能是`native`,也不能是`synchronized`,因为这些关键字与抽象方法的性质相冲突。
26. 内部类是定义在一个类内部的类,分为`Static Nested Class`(静态嵌套类)和`Inner Class`(内部类)。静态嵌套类与外部类之间没有隐含引用,内部类可以直接访问外部类的私有成员。
27. 内部类可以引用其包含类的成员,但需要注意作用域限制,内部类实例只能在外部类实例中创建。
28. 匿名内部类可以继承其他类或实现接口,但不能同时进行。
29. `super.getClass()`返回对象的类信息,可用于反射。
30. `String`是对象,不是基本数据类型。基本数据类型包括`byte`、`short`、`int`、`long`、`float`、`double`、`char`和`boolean`。
31. `"Hello"`被创建为一个不可变的`String`对象,当`s = s + " world!"`时,创建了一个新的`String`对象,原始对象内容不变。
32. 不可以继承`String`类,因为它是final的。
33. `String s = new String("xyz")`创建了两个`String`对象,一个在常量池,一个在堆。两者的内容相同,但引用不同。
34. `String`和`StringBuffer`的区别在于线程安全和性能。`String`是不可变的,每次修改都会创建新对象;`StringBuffer`是可变的,适合在多线程环境中进行字符串拼接。
35. 使用`split(",")`方法可以将逗号分隔的字符串转换为数组。
36. 数组的长度是通过`length`属性获取,如`str.length()`。
以上内容仅是Java面试宝典的一部分,实际面试中可能涵盖更多高级主题,如集合框架、异常处理、并发编程、IO流、设计模式等。